gpt4 book ai didi

c++ - 当类对象完成时,是否会释放为 C++ 类的数据成员动态分配的内存?

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:16:22 27 4
gpt4 key购买 nike

我有这个 C++ 类:

class test{

char* p;
SomeClass* someObject;

test(){
...
p = (char*) malloc(1000);
someObject = new SomeClass();
...
}

~test(){}

}

我是否需要在测试析构函数中显式调用 free(p)delete someObject 以释放它们分配的内存,或者该内存将自动释放?

最佳答案

您需要在析构函数中释放所有动态分配的内存。这不会自动完成。

您的类包含两个指针,并且基本上无法控制它们指向的内容。事实上,这些可能指向您不允许删除的对象,例如:

struct Foo {};
struct Bar {
Foo* f_;
Foo(Foo* f) : f(f_) {}
};

int main() {
Foo f;
Bas b(&f); // b has a Foo ptr, but should it delete it?
}

所以你可以看到自动删除指针数据成员并没有什么意义。

作为一般规则,如果您的类(class)管理资源1,那么您应该负责复制构造和分配;这意味着,如果这对类有意义,您应该禁用它们,或者为它们提供实现,因为编译器生成的那些将不起作用。有关此主题的详细讨论,请参阅 the rule of three ,以及关于 stackoverflow 的广泛讨论:

如果您不遵循此规则,那么默认的复制构造函数和赋值操作将进行浅拷贝,并且您将拥有多个实例,这些实例具有指向相同动态分配对象的指针,它们都将尝试删除这些对象破坏。

您可以使用 smart pointers 避免手动删除使用 new 创建的对象.在你的情况下,类显然拥有动态分配的对象,你应该看看 C++11 的 std::unique_ptrboost::scoped_ptr

最后,除非您真的需要,否则您可以通过完全避免使用指针来真正避免所有内存管理问题。您可以将 char* 替换为 std::string 例如:

class test{

std::string p;
SomeClass someObject;
//test() : someObject() {} // default construction is probably OK...
};

1。也就是说,它分配和释放内存,或者打开和关闭网络连接,或者创建和销毁互斥量等等。

关于c++ - 当类对象完成时,是否会释放为 C++ 类的数据成员动态分配的内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11288358/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com