【问题标题】:setting a pointer member variable correctly正确设置指针成员变量
【发布时间】:2017-01-12 19:59:16
【问题描述】:

我有一个课程L 简化如下:

class L
{
    private:
        C * _pc ;
    public:
        C * getc() const ; // getter
        void setc(const C * ipc); //setter
        ~L()
        {
            delete _pc ;
        }
};

C 是另一个类。

我还有一个帮助类 CHelper 简化如下:

class CHelper
{
    C _c ;
    CHelper(L & ic)
    {
        // 1st constructs _c (code omitted);
        // then sets ic's _pc pointer member variable :
        ic.setc(&_c);
    }
};

感觉删除_pc会出问题,不确定。怎么样?

这种方法有什么缺陷?如何以正确的方法达到相同的“功能”(正确设置指针成员变量)?

【问题讨论】:

  • 您的方法确实存在问题。首先,当CHelper 对象被销毁时,_c 成员也是如此。 _pc 将指向垃圾。其次,delete _pc; 将尝试对同一对象进行第二次销毁。我建议研究 std 智能指针。
  • 您的示例将无法编译。在类L 中,析构函数的名称为~C。那是行不通的。此外,您应该在类的构造中将 _pc 初始化为 nullptr。作为替代方案,您可以考虑使用智能指针,例如 shared_ptrunique_ptr
  • @AdrianRoman 所以我应该用一个聪明的指针替换原始指针C * _pc,它会解决我的问题吗?我该怎么办?
  • @Hayt 错字,已编辑,抱歉

标签: c++ pointers member setter ownership


【解决方案1】:

检查ipc参数是否像数组一样分配,因为数组必须使用delete [] _pc。

【讨论】:

    【解决方案2】:

    您的代码当前无法编译。 CHelper 的构造函数请求 C 对象。 C 类(可能)没有 setc 方法。你的意思可能是CHelper(L& ic)

    无论如何,如果您的 CHelper 对象超出范围并被销毁,则成员变量 _c 将与它一起被销毁。在 L 对象中留下一个悬空指针。不仅如此,L目前也违反了三五规则。

    如果您可以访问 C++11,我强烈建议您将原始指针 _pc_c 替换为 std::shared_ptr 如果需要 CHelper 类(从而删除 delete in该析构函数),否则为std::unique_ptr

    【讨论】:

    • 你是对的,我更正了代码。 _csi 不是指针
    • @user10000100_u 但是对于共享ptr管理是必需的。
    猜你喜欢
    • 2011-02-07
    • 2014-07-25
    • 1970-01-01
    • 1970-01-01
    • 2018-03-07
    • 2020-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多