C ++类中的C'tor

时间:2012-04-03 15:39:59

标签: c++ class constructor nested

我可以声明新变量,比如一个不同的类, 在一个c'tor? 假设我有一个名为List和Node的类(嵌套在List类中),那么我想这样做:

List::List(int num)
{
Node Nod(num); //creating a new Node which is holding num
List_Head=&Nod; //List_Head is a Node pointer variable of List class
}

一旦我这样做,我就会收到以下运行时错误

  

Debug Assertion失败!

     

表达式:_BLOCK_TYPE_IS_VALID(pHead-> nBlockUse)

任何帮助?

2 个答案:

答案 0 :(得分:3)

您创建的Nod的范围和生命周期仅限于构造函数List::List(),因为它是本地/自动对象。

一旦构造函数返回Nod不存在,指向它的任何内容(List_Head)都是悬空指针,引用它会导致未定义行为,很可能是崩溃。

如果要将其引用到构造函数体之外,则应通过调用Node在动态内存(堆)上创建new

List_Head = new Node(num);

理想情况下,您应该使用某种智能指针而不是List_Head的原始指针,这样您就不必进行手动内存管理。如果你不能,你必须打电话:

delete List_Head;

完成使用后,以避免内存泄漏。

答案 1 :(得分:0)

你不能这样做。 Nod超出构造函数末尾的范围(最后}),这意味着它的内存无效,这意味着List_Head指向无效的内存。

如果你想保留内存,你必须使用new,比如

List_Head = new Node(num);

请确保deletenew的内容!但你必须小心这个!如果你不删除它,内存可能会泄漏,如果你没有正确处理它,它可以被双重删除。具体来说,您需要确保还实现析构函数,复制构造函数和赋值运算符以正确处理您分配的内存。

或者,您可以使用智能指针(例如std::shared_ptr如果您正在使用C ++ 11)来处理删除操作,这样您就不会泄漏内存或双重删除内存。您可能仍需要定义复制构造函数和赋值运算符,具体取决于您希望类的操作方式(因为没有这些的自定义版本,您将获得对象的shallow copy而不是{ {3}},这可能不是你想要的。)