运行时错误:模板变量

时间:2013-12-27 18:46:54

标签: c++ templates struct global-variables runtime-error

我有一个类型为struct node的私有变量(请注意,struct节点在头文件中有左,右和父指针以及属性:T value,其中T是模板类型): / p>

node<T>* root

然后我在.cpp文件中使用以下方法:

    template<> void RedBlack<int>::setRoot(int elem) {
    root->value=elem;
}

但是,当我尝试在main方法中创建类的实例,然后尝试从那里设置root的值时,我收到运行时错误:访问不良。

有什么问题吗?附: “模板”概念还是新手。

2 个答案:

答案 0 :(得分:1)

  

我在头文件中有一个struct node类型的私有变量

不,你没有!你实际拥有的是node<T>指针。在您告知之前,它不会指向有效的node对象。如果您尝试取消引用尚未指向有效对象的指针(当您对其执行->时会发生这种情况),则您具有未定义的行为。你很幸运,你的环境给你一个很好的错误。任何事情都可能发生。

您将不得不创建node<T>。一种方法是,如果您的类始终具有根节点,则只需将该成员设为node<T>,而不是node<T>*。然后根节点是类的一部分。否则,您可以通过执行以下操作动态分配它:

root = new node<T>();

但是,不建议动态分配。您必须记住类中析构函数中的delete root;,否则可能会导致内存泄漏。它还意味着提供用户定义的复制构造函数和赋值运算符以避免泄漏。相反,如果您需要动态分配的node,则应该查找smart pointers

答案 1 :(得分:0)

您是否为对象根点分配了内存?

node<T>* root = new node<T>();

您需要在使用之前分配指针引用的对象。如果你不这样做,它指向“什么都没有”,解除引用它会做坏事(如果它指向NULL则为异常,如果指向旧实例或其他对象则使用垃圾等)。

另外,你变量,指针需要在某处“活”。

最好的地方可能是包含root的类:

class MyClass
{
private:
   node<T>* root;

public:
   MyClass() // Constructor
   {
      root = new node<T>();
   }

   ~MyClass() // Destructor
   {
      // NOTE:  If root contains pointers, you need to delete the objects 
      // they point to as well.  
      delete root;
   }

   // Add functions to do something with root...

};