C++ C';c+中的tor+;班

C++ C';c+中的tor+;班,c++,class,constructor,nested,C++,Class,Constructor,Nested,我可以声明新的变量吗,比如一个不同的类, 在c'tor里? 假设我有一个名为List的类和一个节点(嵌套在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 } 一旦我这样做,我会得到以下运行时错误: 调

我可以声明新的变量吗,比如一个不同的类, 在c'tor里? 假设我有一个名为List的类和一个节点(嵌套在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
}
一旦我这样做,我会得到以下运行时错误:

调试断言失败

表达式:\块\类型\有效(pHead->nBlockUse)


有什么帮助吗?

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

一旦构造函数返回的
Nod
不存在,并且指向它的任何东西(
List\u Head
)都是一个悬空指针,推迟它将导致未定义的行为,很可能会导致崩溃

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

List_Head = new Node(num);
理想情况下,对于
列表头
,您应该使用某种智能指针而不是原始指针,这样您就不必手动管理内存。如果你不能,你必须打电话:

delete List_Head;

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

您不能这样做
Nod
超出了构造函数末尾的范围(最后一个
}
),这意味着它的内存无效,这意味着
List\u Head
指向无效内存

如果要保留内存,必须使用
new
,如

List_Head = new Node(num);
只需确保
删除
您的
新内容
!但是你得小心点!如果不删除内存,内存可能会泄漏;如果处理不当,内存可能会被双重删除。具体来说,您还需要确保实现析构函数、复制构造函数和赋值运算符,以正确处理分配的内存


或者,您可以使用智能指针(如
std::shared_ptr
,如果您使用的是C++11),为您处理删除操作,这样您就不会泄漏内存或双重删除内存。您可能仍然需要定义复制构造函数和赋值运算符,这取决于您希望类的作用(因为没有这些C++的自定义版本,您将得到一个对象而不是A,这可能不是您想要的)。一旦退出c'tor作用域,
Nod
将被删除,
List\u Head
指向的内存也将被删除。但如果我在动态内存上创建节点,它只是一个指针。。Node*nod=新节点;我想创建的不是指针,而是节点变量,并在其中插入NUM。我该怎么做?@user1309152:是的,有什么问题吗?只要你有一个指向分配内存的有效指针,一切都是安全的。谢谢,让我们假设我没有列表头。那我该怎么做?那你就被卡住了。您不能像这样动态地将成员添加到类中。