【问题标题】:C++: Pointer being freed was not allocated in a classC++:被释放的指针未在类中分配
【发布时间】:2019-03-16 19:18:51
【问题描述】:

在下面的代码中,我有一个 int 指针和 int 变量作为类的数据成员。我创建了一个类的实例并打印指针指向的值。

执行代码时,我得到以下输出。错误来自于调用析构函数时:

b1.ptr  15    
malloc: *** error for object 0x7ffeefbff49c: pointer being freed was not allocated

代码:

#include <iostream>
using namespace std;

class base{
public:
    int * ptr;
    int val;

    base(int &v1): ptr(&v1){
        val = 20;
    }
    ~base(){
        delete ptr;
    }
};

int main(int argc, const char * argv[]) {
    int val = 15;
    base b1 = base(val);
    cout << "b1.ptr  " << *(b1.ptr) << endl;
    return 0;
}

【问题讨论】:

  • 错误信息很清楚。您没有使用 new 分配指针指向的内存,因此您无法删除它。您传递的变量val 分配在堆栈上。
  • 如果您使用delete ptr,您有责任通过确保ptr 是相应new 表达式的结果来避免未定义的行为。你还没有这样做。在您的示例中,构造函数中的&amp;v1main() 中变量的地址,并且该变量不是使用运算符new 的任何变体分配的。

标签: c++ class


【解决方案1】:

ptr(&amp;v1) 将使用堆栈上的val 的地址初始化ptr(因为v1 是对val 的引用)。 在 ~base() 中,您尝试释放未使用 new 分配的资源,因此您会收到错误消息。

【讨论】:

  • 感谢大家的诊断。我通过在堆上的 main 中分配 val 变量来修改代码,并且代码功能正常。但这是我唯一的选择吗? int *val = new int(15);
  • 您可以传递参考,但请执行ptr(new int(v1)),以便您在这里处理所有事情
【解决方案2】:

这是我对这个问题的理解总结。一旦指针变量 (ptr) 指向堆上的内存位置,我们就可以删除它。有效的选项是:

  1. 作为引用传递给构造函数并随后被指针指向的变量在堆上: int *val = new int(15);

  2. 1234563 ptr(new int(v1))
  3. 在堆上创建一个 b1 的对象,然后代码就可以正常工作了。 这仍然是个谜,因为在这种情况下,val 仍在堆栈中,ptr 指向堆栈的地址(ptr(&amp;v1) 在初始化列表中) int val = 15; base *b1 = new base(val); cout << "b1.ptr " << *(b1->ptr) << endl;

【讨论】:

    【解决方案3】:

    两个答案都指出了原因。我只是想补充一下,你可以做一个live test自己看。

    以下是您的代码中提供更多信息的运行时错误。

    =========== #0 stensal 运行时消息的开始 ===========

    运行时错误:[释放堆栈内存空间]
    继续执行会导致未定义的行为,中止!

    -
    - the memory-space-to-be-freed (start:0xffd73a3c, size:4 bytes) is bound to 'val' at
    -     file:/prog.cc::18, 9
    - 
    - Stack trace (most recent call first) of the error.
    - [1]  file:/musl-1.1.10/src/malloc/new_dts_memory_util.c::20, 5
    - [2]  file:/musl-1.1.10/src/malloc/safe_malloc.c::99, 3
    - [3]  file:/src/new.cpp::124, 9
    - [4]  @[unknown_id 291]
    - [5]  file:/prog.cc::13, 9
    - [6]  file:/prog.cc::21, 5
    - [7]  [libc-start-main]
    -
    

    (104,331)

    ============#0 stensal 运行时消息结束 ============

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-07
      • 1970-01-01
      • 2018-09-30
      相关资源
      最近更新 更多