C++ C++;:未在类中分配要释放的指针

C++ C++;:未在类中分配要释放的指针,c++,class,C++,Class,在下面的代码中,我有一个int指针和int变量作为类的数据成员。我创建了一个类的实例,并打印指针指向的值 当代码被执行时,我得到以下输出。该错误源于调用析构函数时: b1.ptr 15 malloc: *** error for object 0x7ffeefbff49c: pointer being freed was not allocated 代码: #包括 使用名称空间std; 阶级基础{ 公众: int*ptr; int-val; 基本(内部和v1):ptr和v1{ val

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

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

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

#包括
使用名称空间std;
阶级基础{
公众:
int*ptr;
int-val;
基本(内部和v1):ptr和v1{
val=20;
}
~base(){
删除ptr;
}
};
int main(int argc,const char*argv[]{
int-val=15;
基准b1=基准(val);
cout
ptr(&v1)
将使用
val
地址初始化
ptr
(因为
v1
是对堆栈上
val
的引用)。
~base()
中,您试图释放未分配给
new
的资源,因此收到错误消息。

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

  • 作为引用传递给构造函数并随后由指针指向的变量位于堆上:
    int*val=newint(15);

  • 如果变量
    val
    位于堆栈上并通过引用传递,则应在初始值设定项列表中使用以下语法将其复制到堆中,然后让指针指向堆上的位置:
    ptr(新int(v1))

  • 在堆上创建b1的对象,然后代码就可以正常工作。这仍然是一个谜,因为在本例中,
    val
    仍然在堆栈上,
    ptr
    指向堆栈的地址(
    ptr(&v1)
    在初始值设定项列表中)
    int val=15;
    基准*b1=新基准(val);
    
    两个答案都指出了原因。我只想补充一点,你可以自己做一个调查

    下面是代码中信息更丰富的运行时错误

    ============开始0个缩略运行时消息===========

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

    -
    - 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]
    -
    
    (104331)


    =================================================

    错误消息非常清楚。您没有使用new分配指针指向的内存,因此无法删除它。您传递的变量
    val
    ,是在堆栈上分配的。如果您使用
    删除ptr
    ,则您有责任避免未定义通过确保
    ptr
    是相应的
    new
    表达式的结果而进行的行为。您还没有这样做。在您的示例中,构造函数中的
    &v1
    main()中变量的地址
    并且该变量未使用运算符的任何变量
    new
    分配。感谢大家各自的诊断。我通过在堆上的main中分配val变量修改了代码,代码功能正常。但这是我唯一的选项?
    int*val=new int(15);
    你可以传递一个引用,但是要传递ptr(newint(v1))
    所以你可以在这里处理所有的事情
    -
    - 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]
    -