内存泄漏问题; 删除指针

Sim*_*ity 2 c++ pointers delete-operator

如果我有一个指针指向堆上的特定内存地址.我想这同样的指针指向另一个内存地址,我应该先delete指针?但是,在这种情况下,我实际上是删除指针还是只是破坏指针指向的引用(内存地址)?

所以,换句话说,如果我delete是一个指针,这是否意味着它不再存在?或者,它在那里,但没有指出它在哪里?

tem*_*def 6

语法delete有点误导.当你写作

T* ptr = /* ... */
delete ptr;
Run Code Online (Sandbox Code Playgroud)

没有删除该变量ptr.相反,您正在删除ptr指向的对象.值ptr保持不变,它仍然指向以前的位置,所以如果不先重新分配它,应该确保不要取消引用它.

delete重新分配之前,不需要指针.但是,如果要以一种导致丢失对指向对象的最后一个引用的方式重新分配指针,则应该确保(例如,如果此指针是程序中指向其指针的唯一指针),那么你应该delete确保你不泄漏内存.

许多C++程序员用来简化何时释放内存的逻辑的一种技术是使用智能指针,重载模拟指针所需的运算符的对象以及具有自动执行的自定义代码以帮助跟踪资源的对象.例如,新的C++ 0x标准将为此提供一个shared_ptrunique_ptr类型. shared_ptr它的作用类似于常规指针,除了它跟踪shared_ptr资源的数量.当shared_ptr资源的最后一个更改它所指向的位置时(通过重新分配或被销毁),它随后释放资源.例如:

{
    shared_ptr<int> myPtr(new int);
    *myPtr = 137;
    {
       shared_ptr<int> myOtherPtr = myPtr;
       *myPtr = 42;
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,此代码中没有任何地方可以调用delete以匹配调用new!这是因为shared_ptr当最后一个指针停止指向资源时,它足够聪明.

使用智能指针时需要注意一些特性,但它们值得花时间投资来学习.一旦了解了它们的工作原理,就可以编写更清晰的代码.