初始化复杂对象。我什么时候出错?

时间:2013-05-20 02:47:45

标签: c++ runtime-error nodes access-violation

我似乎无法弄清楚为什么每次我对Node对象执行任何操作时程序都会崩溃。在这个工作之前我无法取得任何进展......

我的问题是:每当我尝试在节点X上“设置数据”时,我都会收到访问冲突错误。在此之前,我得到了一个关于不初始化变量的运行时故障#3。所以我把它初始化为null,我仍然得到一个错误。我以前的Node类从来没有给我这个错误,所以我有点难过。任何帮助表示赞赏!

以下是代码:

节点类:

#ifndef NODE
#define NODE

template <typename T>
class Node
{
public:
    Node();
    Node(T data);
    void SetData(T data);
private:
    T m_Data;

};

template <typename T>
Node<T>::Node()
{

}

template <typename T>
void Node<T>::SetData(T data)
{
    m_Data = data;
}
#endif

主:

#include <iostream>
#include <crtdbg.h> 
#include "Node.h"
#define _CRTDBG_MAP_ALLOC

int main()
{
     _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);

     Node<int> * x = nullptr;
     x->SetData(20);

     return 0;
}

奇怪的是,每当我执行“新建”以分配新节点时,都不会发生此问题。 提前谢谢。

2 个答案:

答案 0 :(得分:1)

您正在取消引用空指针值,从而导致未定义的行为。您需要创建Node<int>的实例并将其分配给x,如此

Node<int> * x = new Node<int>();
x->SetData(20);

或使用自动存储持续时间并按值声明x

Node<int> x;
x.SetData(20);

答案 1 :(得分:0)

  Node<int> * x = nullptr;
  x->SetData(20);

x是一个空指针,您使用空指针来访问更改类的数据的类的成员函数,这将导致未定义的行为。有关详细信息,请参阅what will happen when I call member function on NULL object pointer

您应该初始化指向类的某些对象的指针:

  Node<int> * x = new Node<int>();
  x->SetData(20);