Nic*_*ner 6 c++ heap memory-management
我有一个包含指针的结构:
struct foo
{
char* f;
int* d;
wchar* m;
}
Run Code Online (Sandbox Code Playgroud)
我有一个这些结构的共享指针向量:
vector<shared_ptr<foo>> vec;
Run Code Online (Sandbox Code Playgroud)
vec在堆栈上分配.当它在方法结束时超出范围时,将调用其析构函数.(对吗?)然后将调用向量中每个元素的析构函数.(对吧?)调用delete foodelete只是指针foo.f,或者它实际上是从堆中释放内存吗?
bsh*_*lds 15
delete foo;
Run Code Online (Sandbox Code Playgroud)
将删除分配给foo结构的内存,其中包括三个指针.但是如果你实现了一个明确删除它们的析构函数,指针本身指向的内存只会被删除.
CB *_*ley 10
如果您已动态分配foo,例如:
foo* f = new foo;
Run Code Online (Sandbox Code Playgroud)
然后delete f将破坏动态分配的foo对象,包括它包含的指针但不指向指针指向的任何东西,如果它们确实指向动态分配的对象或对象数组.
如果您已将动态分配的foo对象(即结果new foo)分配给shared_ptr(假设为tr1或boost),那么当最后一次shared_ptr引用该对象超出范围时,delete将在最初new foo自动返回的指针上调用.您不必手动执行此操作.
如果你的object(foo)包含指向它所拥有的动态分配对象的指针(因此需要在生命周期结束时解除分配foo),那么强烈建议你编写一个析构函数来以正确的方式释放这些对象(这取决于他们是如何分配的).
一旦编写了析构函数,就需要考虑是否需要编写复制构造函数和复制辅助运算符.当您使用共享指针向量时,您可能决定不应复制您的对象.如果是这样,您可以将这些声明为私有,无需提供实现.
您还应该考虑一个或多个构造函数,以确保您的指针成员已初始化.如果指针成员永远不会被初始化,那么如果它们在a的生命周期中没有被赋值,foo那么它们既不会为null,也不会指向有效对象,这很可能会导致析构函数出错.