在下面的代码中,我有一个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;
}
答案 0 :(得分:0)
ptr(&v1)
将使用栈中的地址ptr
初始化val
(因为v1
是对val
的引用)。
在~base()
中,您尝试释放未用new
分配的资源,因此会收到错误消息。
答案 1 :(得分:0)
这是我对这个问题的理解的总结。一旦指针变量(ptr)指向堆上的内存位置,我们就可以删除它。起作用的选项是:
作为对构造函数的引用传递并随后由指针指向的变量位于堆上:
int *val = new int(15);
如果变量val
在堆栈上并通过引用传递,则应在初始化列表中使用以下语法将其复制到堆,然后使指针指向堆上的位置:
ptr(new int(v1))
在堆上创建b1对象,然后代码可以正常工作。 这仍然是个谜,因为在这种情况下,val
仍在堆栈上,并且ptr
指向堆栈的地址(初始化器列表中的ptr(&v1)
)
int val = 15;
base *b1 = new base(val);
cout << "b1.ptr " << *(b1->ptr) << endl;
答案 2 :(得分:0)
两个答案都指出了原因。我只想添加,您可以执行live test自己查看。
以下是代码中信息量更大的运行时错误。
===========#0扩展运行时消息的开头===========
运行时错误: [释放堆栈内存空间]
继续执行会导致不确定的行为,中止!
const ImageToggler = ({ primaryImg, mouseOverImg }) => {
const imageRef = useRef(null);
const handleMouseOverHandler = () => {
imageRef.current.src = mouseOverImg;
};
const handleMouseOutHandler = () => {
imageRef.current.src = primaryImg;
};
useEffect(() => {
imageRef.current.addEventListener(
"mouseover",
handleMouseOverHandler,
true
);
imageRef.current.addEventListener("mouseout", handleMouseOutHandler, true);
return () => {
imageRef.current.removeEventListener(
"mouseover",
handleMouseOverHandler,
false
);
imageRef.current.removeEventListener(
"mouseout",
handleMouseOutHandler,
false
);
};
}, []);
(104,331)
============#0扩展运行时消息结束============