危险的做法?

时间:2013-06-04 01:29:24

标签: c++ pointers stack heap

这有什么危险吗?我不知道其他的做法,但似乎非常可疑。

class cA
{
public:
    cA(){}
    ~cA(){}
    int a;
//say class have tons of members..
};


int _tmain( int argc, _TCHAR* argv[] )
{
    cA obj;
    cA *ptr = new cA;
    *ptr = obj;
    //ofc there is a 'delete ptr;' after
}

如果我在C ++上记得正确,这意味着将创建cA的对象并且ptr将指向它,我必须这样做以插入长寿容器({{1} })。

是否将obj的内容从堆栈复制到有效的堆?

编辑可能的解决方案?

vector<cA*>

3 个答案:

答案 0 :(得分:2)

这不是一种危险的做法,但如果您是cA的班级作者,请覆盖operator=,以便它能够正确复制。

同样沿着这些行,实现一个复制构造函数。

答案 1 :(得分:2)

而不是这种形式:

cA obj;
cA *ptr = new cA;
ptr->Copy( obj );

为什么不用这种形式?

cA obj;
cA *ptr = new cA(ob);  

您的复制构造函数将如下所示。还应该有一个赋值运算符。

class cA
{
public:
    cA(){}
    CA(const cA& ref)
    {
        a = ref.a;
    }
    ~cA(){}

    cA& operator=(const cA& p) {
        if (this != &p) {  // make sure not same object
            a = p.a;
        }
        return *this;    // Return ref for multiple assignment
    }

    int a;
};

之前你所做的并不危险,但也许有点难以理解。

答案 2 :(得分:1)

没关系。但这取决于。

如果您的类是普通的旧数据类型(例如,如果它是所有简单,非指针或非资源管理成员),则您不需要实现复制构造函数或赋值运算符。比如说,如果cA只包含一堆浮点数,整数和bool,你需要简单地复制每个成员的值,那么自动编译器生成的复制构造函数就可以了。

但是,如果它拥有指向某个内部资源的指针,那么您需要实现一个复制构造函数和赋值运算符,以正确处理底层资源的复制(“深层”复制)。

如果您计划继承cA,则只需要一个虚拟析构函数。否则,您只是无缘无故地将vtable指针膨胀添加到类的每个实例。如果你不打算继承子类,并且正在使用C ++ 11,你可以将你的类设置为final,这意味着如果有人试图继承cA,你不必担心虚拟析构函数问题。无论如何(它会给他们一个编译错误)。

此外,在创建新类时,可以帮助实现自动将复制构造函数和赋值运算符声明为private。然后,当您尝试执行复制分配时,您会收到编译器错误,此时您可以删除声明以允许编译器生成自动版本。通过这种方式,您可以对如何使用类进行更多控制和反馈,并且可以避免以后出现意外情况。