C++:删除结构?

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结构的内存,其中包括三个指针.但是如果你实现了一个明确删除它们的析构函数,指针本身指向的内存只会被删除.

  • 或者,更改f,d和m以使用自动或共享指针. (2认同)

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,也不会指向有效对象,这很可能会导致析构函数出错.