c++ - 在分配不同的值之前是否有必要在指针上使用 'delete'?

标签 c++

这可能是一个愚蠢的问题,但我不确定这样做的正确方法是什么(搜索没有为我提供明确的答案)。

考虑以下代码段:

class D;

class C
{
    C() {m_Ptr = new D;};
    ~C() {delete m_Ptr;};

    public:
        void setPtr(const D &obj) {*m_Ptr = obj};

    private:
        D *m_Ptr;
};

是否可以简单地为 *m_Ptr 分配新值,即使它已经指向 D 类的不同对象?我倾向于使用:

void C::setPtr(const D &obj)
{
    delete m_Ptr;
    *m_Ptr = obj;
}

但我不确定这是必要的还是好的/坏的做法。我的理由是每个"new"都应该有它的“删除”(或其他释放内存的方法,例如 Qt 中的父子机制)。

感谢您的澄清!

最佳答案

如果您重新分配指针,您可能需要执行delete。在你的情况下你不这样做,你只是改变指针指向的数据。

事实上,做例如

delete m_Ptr;
*m_Ptr = obj;

会导致未定义的行为,因为您在释放指针指向的内存后取消对指针的引用,然后写入您不再“拥有”的内存。

关于c++ - 在分配不同的值之前是否有必要在指针上使用 'delete'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22653636/

相关文章:

c++ - undefined reference 和运算符 << 对我

c++ - QListWidget : Event on item click

c++ - 两个看似相似的函数给出了不同的结果。为什么?

c++ - 什么决定了 constexpr 函数是否是常量表达式?

c++ - 仅当 Qt 是使用 ltcg 构建时,如何有条件地启用 ltcg?

c++ - c库链接到什么点

c++ - 将结构传递给函数而不键入每个成员(C++ 无指针)

c++ - 带有 -isysroot 的 gcc 创建包含以等号 "="开头的包含路径并且编译失败

c++ - BOOST TEST中如何取消 "fatal error"检测

c++ - 为什么这段代码用 gcc 编译而不用 clang