我可以声明新变量,比如一个不同的类, 在一个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)
任何帮助?
答案 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);
请确保delete
你new
的内容!但你必须小心这个!如果你不删除它,内存可能会泄漏,如果你没有正确处理它,它可以被双重删除。具体来说,您需要确保还实现析构函数,复制构造函数和赋值运算符以正确处理您分配的内存。
或者,您可以使用智能指针(例如std::shared_ptr
如果您正在使用C ++ 11)来处理删除操作,这样您就不会泄漏内存或双重删除内存。您可能仍需要定义复制构造函数和赋值运算符,具体取决于您希望类的操作方式(因为没有这些的自定义版本,您将获得对象的shallow copy而不是{ {3}},这可能不是你想要的。)