繁体   English   中英

C ++局部变量内存管理

[英]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());

这首先创建一个自动存储持续时间为objmyClass对象。 该对象由表达式*(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());

那条线:

  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.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM