【问题标题】:Object on stack unexpectedly gets deleted堆栈上的对象意外被删除
【发布时间】:2014-11-30 08:38:03
【问题描述】:

我遇到了一个奇怪的错误。每当我在堆栈上创建一个对象时,都会调用我的解构器,然后使用它的“插入”函数。插入函数不会删除任何内容。如果我在堆上创建对象然后调用插入,则永远不会调用解构函数(这显然是我想要的)。这个问题只发生在我的插入函数中。 empty() 或 size() 等其他函数不会引发相同的错误。

我正在使用 Visual Studio 2012。

问题出现的地方:

Map n;
n.insert(5, "5");
//Map deconstructor gets called unexpectedly

没有出现问题的地方

Map *n = new Map ();
n->insert (5, "5");
//Map deconstructor does not get called

代码:

struct node
{
   int key;
   string value;
   node *left, *right;
};

//Note: I took away unrelated code from this function, b/c I narrowed down the problem 
void Map::insert (int key, string value)
{
  root = new node(); /**<-- This is the offending piece of code I think. If I comment it out, then the map deconstructor won't get called after the function exits*/
  root->key = key;
  root->value = value;
  root->left = NULL;
  root->right = NULL;
}
Map::~Map(void)
{
    cout << "Deconstructor being called";
}

Map::Map(void)
{
    root = NULL;
}

【问题讨论】:

  • n 是否超出范围?您应该整理一个简短的完整示例来说明您正在做什么。
  • 你需要先学习语言。对于这个问题,学习内存管理部分
  • 你能提供an example we can actually run吗?您发布的内容缺少我们需要查看以回答问题的上下文。
  • 如果您致电insert会怎样?您如何确定insert 与您的问题有关?
  • 插入后是否有}

标签: c++


【解决方案1】:

这就是析构函数在 C++ 中的工作方式

自动对象的析构函数被自动调用。动态分配的对象需要您delete 它们。

【讨论】:

    【解决方案2】:

    哎呀,我才意识到这实际上是 预期的。在我的主函数(对象被实例化和插入的地方)退出后,解构函数被自动调用。在堆上创建对象时不会发生这种情况,除非我明确调用删除。 它仅在插入期间发生,因为在解构对象之前检查根是否不为 NULL 的函数。如果没有插入,则根为NULL,函数就退出。

    非常感谢。

    【讨论】:

      猜你喜欢
      • 2014-04-22
      • 2013-03-05
      • 2013-08-03
      • 1970-01-01
      • 1970-01-01
      • 2014-02-28
      • 2013-01-25
      • 2016-02-04
      • 1970-01-01
      相关资源
      最近更新 更多