c++ Dynamic Memory

1. make_shared<T>(args): return a shared_ptr dynamically allocated object of type T. Use args to initialize the object.

shared_ptr<T> p(q): p is a copy of shared_ptr q. Increase the count in q. The pointer in q must be convertable to T.

p = q: p and q are shared_ptr holding pointers that are convertable to one another. Decrease p‘s reference count, and increase q‘s count; delete p‘s existing memory if p‘s count goes to zero.

p.use_count(): return the number of objects sharing with p. Intended for debug purpose.

2. Ordinarily we use auto to make it easier to define an object to hold the result of make_shared:

auto p1 = make_shared<revector<string>>();
auto p2 = make_shared<int>(42);
auto p(q); // p and q point to the same object

3. The fact that the shared_ptr class automatically free dynamic objects when they are no longer needed makes it fairly easier to use dynamic memory.

// factory return a shared_ptr pointing to a dynamically allocated object
shared_ptr<Foo> factory(T arg)
{
    // process arg as a appropriate
    // shared_ptr will take care of deleting the memory
    return make_shared<Foo>(arg);
}

void use_factory(T arg)
{
    shared_ptr<Foo> p = factory(arg);
    // use p
} // p goes out of scope. The memory to which p points is automatically free

4.If you put shared_ptrs into a container, you should be sure to erase shared_ptr elements once you no longer need those elements.

Programs tend to use dynamic memory for one of three purpose:

  • They don‘t know how many object they will need
  • They don‘t know the precise type of the object they need.
  • They want to share data between serval objects.

So far, the classes we have used allocate resources that exist only as long as the corresponding object

vector<string> v1;
{
    vector<string> v2 = {"a", "aa", "bbb"};
    v1 = v2;    // copies the elements in v2 to v1
}    // v2 is deleted, which destroys the elements in v2
     // v1 has three new copied elements

Two operators allocate and delete dynamic memory:

  • new: allocates memory
  • delete: frees memory allocated by new.

Use these two operator is more error-prone than using a smart pointer.

A dynamic object managed through a build-in pointer exists until it is explictly deleted

Foo factory(T arg)
{
    return new Foo(arg);    // caller is responsible for deleting this memory
}

void use_factory(T arg)
{
    Foo *p = use_factory(arg);
    // use p but do not delete it
} p goes out of scope, but the memory to which p points is not freeed.

In this example, p was the only pointer to memory allocated by factory. Once use_factory returns, the program has no way to free the memory. Then memory leak.

There are three common problem with using new and delete to manage dynamic memory:

  • Forgetting to delete memory, which is known as memory leak
  • Using a object after it has been deleted
  • Deleting the same object twice

We should use smart pointers rather than plain pointers

If we do not initialize a smart pointer, it is initialized as a null pointer. We can also initialize a smart pointer from a pointer return from new

shared_ptr<double> p1;
shared_ptr<int> p2(new int(42));

The smart pointer constructors that take pointers are explict. We can not implictly conver a build-in pointer to a smart pointer.

shared_ptr<int> p1 = new int(1024);    // error
shared_ptr<int> p2(new int(1024));    // ok. use direct initilization

A function that return a shared_ptr cannot implictly return a plian pointer in its return statement

shared_ptr<int> clone(int p)
{
    return new int(p);    // error
}

shared_ptr<int> clone(int p)
{
    // ok; explicitly create a shared_ptr from int *
    return shared_ptr<int>(new int(p));
}

Don‘t mix ordinary pointers and smart pointers.

When we bind a shared_ptr to a pain pointer, we give responsibility for that memory to the shared_ptr, and we should no longer use a build-in pointer to access the memory to which the shared_ptr now points.

Don‘t use get to initilize or assign another smart pointer.

时间: 2024-12-29 10:35:14

c++ Dynamic Memory的相关文章

Cpp Chapter 12: Classes and Dynamic Memory Allocation Part1

12.1 Dynamic memory and classes 12.1.1 A review example and static class members Now try implement a String class(a flawed one): // strngbad.h -- flawed string class definition #include <iostream> #ifndef STRNGBAD_H_INCLUDED #define STRNGBAD_H_INCLU

Cpp Chapter 12: Classes and Dynamic Memory Allocation Part2

12.3 Things to remember when using new in constructors ) If you use new in constructors, use delete in destructor. Their use should be compatible, pair new with delete and new [] with delete [] ) Multiple constructors should share the same way of new

CIT 593 Dynamic Memory

CIT 593 | Assignment: Dynamic Memory & File I/O | 1Setting up Codio for this HW:1) Open the Codio assignment via Coursera2) From the Codio File-Tree click on: lc4_memory.h and lc4_memory.cOverview:The goal of this HW is for you to write a program tha

c++ Dynamic Memory (part 2)

Don't use get to initialize or assign another smart pointer. The code that use the return from get can not delete the pointer Although the compiler will not complain, it is an error to build another smart pointer to the pointer returned by get shared

[Paper翻译]Scalable Lock-Free Dynamic Memory Allocation

原文: http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.87.3870&rep=rep1&type=pdf Abstract 动态内存分配器(malloc/free)在多线程环境下依靠互斥锁来保护共享数据的一致性.使用锁在性能,可用性,健壮性,程序灵活性方面有很多缺点.Lock-free的内存分配器能消除线程延迟或被杀死以及CPU的调度策略对程序的性能影响.这篇paper呈上了一个完整的无锁内存分配器.它的实现只使用被广泛支

C++ storage allocation + Dynamic memory allocation + setting limits + initializer list (1)

1. 对象的空间在括号开始就已经分配,但是构造在定义对象的时候才会实现,若跳过(譬如goto),到括号结束析构会发生错误,编译会通不过. 2.初始化 1 struct X { int i ; float f; char c;}; 2 3 - X x1 = { 1,2.2,'c'}; 4 X x2[3] = { {1,1.1,'a'},{2,2.2,'b'} }; 5 6 7 struct Y {float f; int i; Y(int a);} ; 8 9 Y y1[] = {Y(1),Y(2

Memory Leak Detection in Embedded Systems

One of the problems with developing embedded systems is the detection of memory leaks; I've found three tools that are useful for this. These tools are used to detect application program errors, not kernel memory leaks. Two of these tools (mtrace and

《CS:APP》 chapter 9 Vitrual Memory 笔记

Vitrual Memory In order to manage memory more efficiently and with fewer errors, modern systems provide an abstraction of main memory known as virtual memory (VM). Virtual memory is an elegant interaction of hardware exceptions, hardware ad-dress tra

Memory Layout (Virtual address space of a C process)

Memory Layout (Virtual address space of a C process) 分类: C语言基础2012-12-06 23:16 2174人阅读 评论(0) 收藏 举报 found a good example to demostrate the memory layout and its stack info of a user-mode process, only that this example is for Linux. But it is still wo