我有以下代码:
void someFunction() {
.......
myClass obj= *(new myClass());
........
delete &obj;
}
我收到一个运行时错误,提示指针无效。
没有“删除”行,代码运行良好。
我知道我需要重新声明由 new 运算符动态分配的内存。但我不知道在这种情况下发生了什么,以及我如何甚至需要释放内存?
谢谢
我有以下代码:
void someFunction() {
.......
myClass obj= *(new myClass());
........
delete &obj;
}
我收到一个运行时错误,提示指针无效。
没有“删除”行,代码运行良好。
我知道我需要重新声明由 new 运算符动态分配的内存。但我不知道在这种情况下发生了什么,以及我如何甚至需要释放内存?
谢谢
如果您的意图是让实例仅存在于此函数的范围内,那么您不需要使用动态分配......
void someFunction() {
.......
myClass obj;
........
}
...在这种情况下,obj
构造函数在声明时myClass obj
调用,而析构函数在函数返回时调用。否则,如果它必须是动态的,那么这...
void someFunction() {
.......
myClass* obj = new myClass();
........
delete obj;
}
...在这种情况下,当您调用时调用构造函数,new myClass()
并在调用时调用析构函数delete obj
- 但是,在这种情况下,您需要声明obj
为指向myClass
对象的指针,以便有一个存储返回值的地方从new
.
在您的示例中,我认为您无法重新声明内存。
obj 是您使用 *(new myClass()) 创建的匿名类的副本。“obj”在堆栈上分配......它没有在堆上分配(这是新分配的地方)。
当您尝试删除 &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());
这首先会创建一个myClass
名为 的具有自动存储持续时间的对象obj
。该对象由表达式初始化*(new myClass())
。此表达式动态分配一个myClass
对象,然后取消引用指向该对象的指针。所以你最终在这里做的是动态分配一个对象,然后将它复制到obj
.
您现在已经忘记了动态分配的对象。这不好。这样做delete &obj;
只会获取自动对象的地址并尝试销毁它,但您只能使用delete
动态分配的对象。
您可以更改obj
为参考,它会起作用:
myClass& obj = *(new myClass());
这可以确保动态分配的对象不会被复制。然而,这不是一个好主意。它掩盖了obj
引用必须为delete
d 的对象的事实。相反,您最好存储指针本身:
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.