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

时间:2019-03-16 19:18:52

标签: c++ class

在下面的代码中,我有一个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;
}

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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

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

  3. 在堆上创建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扩展运行时消息结束============