Ehs*_*hmi 1 c++ memory free allocation dynamic
我有这个C++类:
class test{
char* p;
SomeClass* someObject;
test(){
...
p = (char*) malloc(1000);
someObject = new SomeClass();
...
}
~test(){}
}
Run Code Online (Sandbox Code Playgroud)
我是否需要调用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?
}
Run Code Online (Sandbox Code Playgroud)
因此,您可以看到指针数据成员自动删除并不合理.
作为一般规则,如果您的班级管理资源1,那么您应该负责复制构造和分配; 这意味着,如果对类有意义,则应该禁用它们,或者为它们提供实现,因为编译器生成的那些不起作用.有关此主题的详细讨论,请参阅规则三,以及有关stackoverflow的广泛讨论:
如果不遵循此规则,则默认的复制构造函数和赋值操作将生成浅表副本,并且您将有多个实例具有指向相同动态分配对象的指针,这些对象在销毁时都会尝试删除.
您可以避免手动删除new
使用智能指针创建的对象.在你的情况下,类显然拥有动态分配的对象,你应该看看C++ 11的std :: unique_ptr或boost :: scoped_ptr
最后,除非你真的需要,否则你可以通过避免所有指针来避免所有内存管理问题.你可以取代你char*
用std::string
,例如:
class test{
std::string p;
SomeClass someObject;
//test() : someObject() {} // default construction is probably OK...
};
Run Code Online (Sandbox Code Playgroud)
即,它分配和释放内存,或打开和关闭网络连接,或创建和销毁互斥锁等.
归档时间: |
|
查看次数: |
2683 次 |
最近记录: |