0

我有以下代码:

void someFunction() {
  .......
  myClass obj= *(new myClass()); 

  ........

  delete &obj;
}

我收到一个运行时错误,提示指针无效。

没有“删除”行,代码运行良好。

我知道我需要重新声明由 new 运算符动态分配的内存。但我不知道在这种情况下发生了什么,以及我如何甚至需要释放内存?

谢谢

4

5 回答 5

4

如果您的意图是让实例仅存在于此函数的范围内,那么您不需要使用动态分配......

void someFunction() {
  .......
  myClass obj; 

  ........

}

...在这种情况下,obj构造函数在声明时myClass obj调用,而析构函数在函数返回时调用。否则,如果它必须是动态的,那么这...

void someFunction() {
  .......
  myClass* obj = new myClass(); 

  ........

  delete obj;
}

...在这种情况下,当您调用时调用构造函数,new myClass()并在调用时调用析构函数delete obj- 但是,在这种情况下,您需要声明obj为指向myClass对象的指针,以便有一个存储返回值的地方从new.

于 2013-04-28T22:21:43.483 回答
2

在您的示例中,我认为您无法重新声明内存。

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.
于 2013-04-28T22:21:34.623 回答
1

您的obj变量必须保存对取消引用指针的引用,以便以后可以(相当奇怪地)删除它:

myClass& obj;
//     ^

但是你不需要这样定义它,你可以定义一个指向内存的指针:

myClass* obj = new myClass();

并以这种方式删除它:

delete obj;

或者,更好的是,您可以使用内存管理工具,例如std::unique_ptr

std::unique_ptr<myClass> obj(new myClass);

但据我所知,这里对于动态内存确实没有用处,只需将其实例化为普通变量:

myClass obj;
于 2013-04-28T22:22:26.033 回答
1
myClass obj= *(new myClass());

这首先会创建一个myClass名为 的具有自动存储持续时间的对象obj。该对象由表达式初始化*(new myClass())。此表达式动态分配一个myClass对象,然后取消引用指向该对象的指针。所以你最终在这里做的是动态分配一个对象,然后将它复制obj.

您现在已经忘记了动态分配的对象。这不好。这样做delete &obj;只会获取自动对象的地址并尝试销毁它,但您只能使用delete动态分配的对象。

可以更改obj为参考,它会起作用:

myClass& obj = *(new myClass());

这可以确保动态分配的对象不会被复制。然而,这不是一个好主意。它掩盖了obj引用必须为deleted 的对象的事实。相反,您最好存储指针本身:

myClass* obj = new myClass();
// ...
delete obj;

或者更好的是,使用像std::unique_ptr<myClass>.

甚至更好,甚至不要同时动态分配它。只需使用自动对象:

myClass obj;
// No need to allocate or delete anything
于 2013-04-28T22:23:34.510 回答
1
myClass obj= *(new myClass());

那行:

  1. 创建一个myClass具有自动存储持续时间的实例。
  2. 动态分配myClass.
  3. 取消引用返回的指针并将对象复制到obj. 指向动态分配对象的指针被丢弃,导致内存泄漏。
  4. 调用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.
于 2013-04-28T22:25:50.660 回答