[英]c++ local variable memory management
我有以下代码:
void someFunction() {
.......
myClass obj= *(new myClass());
........
delete &obj;
}
我收到一个运行时错误消息,指出无效指针。
该代码运行良好,没有“ delete”行。
我知道我需要收回新操作员动态分配的内存。 但是我不知道在这种情况下怎么回事,以及我什至需要释放内存吗?
谢谢
如果您的目的是使实例仅存在于此函数的范围内,则无需使用动态分配...
void someFunction() {
.......
myClass obj;
........
}
...在这种情况下,当在myClass obj
处声明obj
构造函数时将调用它,而在函数返回时将调用析构函数。 否则,如果它必须是动态的,那么这...
void someFunction() {
.......
myClass* obj = new myClass();
........
delete obj;
}
...在这种情况下,当您调用new myClass()
时将调用构造函数,而在调用delete obj
时将调用析构函数-但是,在这种情况下,您需要将obj
声明为指向myClass
对象的指针,以便有一个地方可以存储new
的返回值。
在您的示例中,我认为您无法收回内存。
obj是您使用*(new myClass())创建的匿名类的副本 。 “ obj”分配在堆栈上...它没有分配在堆上(这是new分配的地方)。
当您尝试删除&obj时,您正在尝试删除所创建副本的堆栈内存。
尝试类似
myClass *obj = new myClass(); // memory is allocated from the heap and a pointer returned
myClass copyOfObj = *obj; // memory is allocated on the stack. a *shallow* copy of obj is made
delete obj.
您的obj
变量必须保存对已取消引用的指针的引用,以便以后可以(更奇怪的是)将其删除:
myClass& obj;
// ^
但是您不必以这种方式定义它,而是可以定义一个指向内存的指针:
myClass* obj = new myClass();
并以这种方式将其删除:
delete obj;
或者,更好的是,您可以使用诸如std::unique_ptr
类的内存管理工具:
std::unique_ptr<myClass> obj(new myClass);
但据我所知,这里对于动态内存确实没有用,只是将其实例化为普通变量:
myClass obj;
myClass obj= *(new myClass());
这首先创建一个自动存储持续时间为obj
的myClass
对象。 该对象由表达式*(new myClass())
初始化。 该表达式动态分配一个myClass
对象,然后取消对该对象的指针的引用。 因此,您最终在这里要做的是动态分配一个对象,然后将其复制到obj
。
您现在已经失去了动态分配对象的跟踪。 这不好。 delete &obj;
只会使用自动对象的地址并尝试销毁该地址,但是您必须仅对动态分配的对象使用delete
。
您可以将obj
更改为引用,它将起作用:
myClass& obj = *(new myClass());
这样可以确保不会复制动态分配的对象。 但是,这不是一个好主意。 它掩盖了obj
引用必须delete
的对象的事实。 相反,最好不要存储指针本身:
myClass* obj = new myClass();
// ...
delete obj;
甚至更好,使用类似std::unique_ptr<myClass>
的智能指针。
甚至更好的是,甚至都不要动态分配它。 只需使用一个自动对象:
myClass obj;
// No need to allocate or delete anything
myClass obj= *(new myClass());
那条线:
myClass
实例。 myClass
的实例。 obj
。 指向动态分配对象的指针将被丢弃,从而导致内存泄漏。 delete
,这将导致未定义的行为。 这个对象不是使用分配的new
或任何变种new
。 您的代码应为:
myClass *p = new myClass();
// use p
delete p;
您可能根本不需要动态内存分配,所以...
myClass obj; // that's it!
接下来,阅读智能指针。
std::unique_ptr<myClass> p(new myClass());
// no delete! unique_ptr handles it for you when it goes
// out of scope and has the benefit of being exception safe.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.