在哪种情况下删除指针

tam*_*aka 14 c++

我的以下问题是关于内存管理.我有一个int变量没有在类中动态分配,比如说invar1.我将此int的内存地址传递给另一个类构造函数.那个班级做到了这个:

class ex1{
    ex1(int* p_intvar1)
    {
       ptoint = p_intvar1;
    }

    int* ptoint;
};
Run Code Online (Sandbox Code Playgroud)

我应该删除ptoint吗?因为它具有动态分配的int的地址,所以我认为我不需要删除它.

我再次向一个带有new运算符的类声明一个对象:

objtoclass = new ex1();
Run Code Online (Sandbox Code Playgroud)

我将它传递给另一个班级:

class ex2{
    ex2(ex1* p_obj)
    {
       obj = p_obj;
    }

    ex1* obj;
};
Run Code Online (Sandbox Code Playgroud)

当我已经删除了objtoclass时,我应该删除obj吗?

谢谢!

Lig*_*ica 12

因为它具有动态分配的int的地址,我认为我不需要删除它.

正确.

当我已经删除了objtoclass时,我应该删除obj吗?

没有.

回想一下,你实际上并没有删除指针; 你正在使用指针删除他们指向的东西.因此,如果您同时写了两个,delete obj并且delete objtoclass因为两个指针都指向同一个对象,那么您将删除该对象两次.

我会提醒你,这是一个非常容易犯错的错误,你的ex2类,其中指向对象的所有权语义并不完全清楚.您可以考虑使用智能指针实现来消除风险.


ser*_*gej 8

只是其他答案的附录

您可以在智能指针(shared_ptr,unique_ptr)的帮助下摆脱原始指针并忘记内存管理.

智能指针负责在超出范围时释放内存.

这是一个例子:

#include <iostream>
#include <memory>

class ex1{
public:
    ex1(std::shared_ptr<int> p_intvar1)
    {
        ptoint = p_intvar1;
        std::cout << __func__ << std::endl;
    }

    ~ex1()
    {
        std::cout << __func__ << std::endl;
    }
private:
    std::shared_ptr<int> ptoint;
};

int main()
{
    std::shared_ptr<int> pi(new int(42));
    std::shared_ptr<ex1> objtoclass(new ex1(pi));

    /* 
     * when the main function returns, these smart pointers will go
     * go out of scope and delete the dynamically allocated memory
     */ 

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

ex1
~ex1
Run Code Online (Sandbox Code Playgroud)