正确设置指针成员变量

时间:2016-09-05 12:34:15

标签: c++ pointers member setter ownership

我的课程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会有问题。怎么样?

这种approch的缺点是什么?我怎样才能达到相同的功能" (使用正确的方法正确设置指针成员变量?

2 个答案:

答案 0 :(得分:0)

您的代码目前尚未编译。 C的构造函数要求C个对象。 setc类(可能)没有CHelper(L& ic)方法。你可能意味着CHelper

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

如果您有权访问C ++ 11,我建议如果需要_c类,则用std::shared_ptr替换原始指针CHelperdelete(从而删除该析构函数中的std::unique_ptr,否则删除select coalesce(A.DID_CENT,B.DID_CENT,C.DID_CENT) DID_CENT, nvl(sum(A.cnt),0) A, nvl(sum(B.cnt),0) B, nvl(sum(C.cnt),0) C from ( SELECT DID_CENT, COUNT (*) cnt from TXN_TOTO WHERE (CO1 = '1L' OR CO1 = '1') AND OP1 in('P3', 'R1') GROUP BY DID_CENT ) A FULL JOIN ( SELECT DID_CENT, COUNT (*) cnt from TXN_TITI WHERE (CO1 = '1L' OR CO1 = '1') AND OP1 in('P3', 'R1') AND STAT = 6 GROUP BY DID_CENT ) B ON A.DID_CENT=B.DID_CENT FULL JOIN ( SELECT DID_CENT, COUNT (*) cnt from TXN_TITI tti inner join TXN_TATA ttdi ON tti.ID_DINT = ttdi.ID_DINT WHERE (CO1 = '1L' AND OP1 in('01', '04', 'Z8')) OR (CO1 = '1' AND OP1 in('P3', 'R1')) GROUP BY DID_CENT ) C ON B.DID_CENT=C.DID_CENT GROUP BY coalesce(A.DID_CENT,B.DID_CENT,C.DID_CENT)

答案 1 :(得分:-3)

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