【问题标题】:Initializing a complex object. Error when I don't?初始化复杂对象。当我不这样做时出错?
【发布时间】:2013-05-20 02:47:45
【问题描述】:

我似乎无法弄清楚为什么每次我对 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;
}

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

【问题讨论】:

  • 好的,我尝试将其设为局部变量,但由于未初始化,它仍然让我崩溃。运行时检查失败 #3 我不明白为什么在我最近的 4-5 个项目中现在会发生这种情况我可以毫无问题地实例化这些??

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


【解决方案1】:

您正在取消引用一个导致未定义行为的空指针值。您需要创建一个Node&lt;int&gt; 的实例并将其分配给x,就像这样

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

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

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

【讨论】:

  • 好的,感谢您的回复!但是,如果我使用局部变量选项,我会得到一个运行时错误 #3,因为没有初始化变量..
  • 这个错误听起来像是你将局部变量声明为Node&lt;int&gt; *x; 而不是Node&lt;int&gt; x;
  • 是的,我是对的。所以你是说我不能在不分配新内存的情况下实例化节点指针?我宁愿不避免内存泄漏..
  • 如果您将x 声明为指针,您需要创建一个实例并将其分配给x,然后再使用它。如果您想避免内存泄漏,请使用 std::unique_ptr&lt;Node&lt;int&gt;&gt; x 之类的智能指针。
  • 好的,我现在明白为什么了。非常感谢Oblivious船长的帮助,非常有帮助!
【解决方案2】:
  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);

【讨论】:

  • 感谢taocp的回复
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-18
  • 2011-12-27
相关资源
最近更新 更多