假设我创建了一个自定义 Array 类并具有以下构造函数:
Array::Array(size_t size)
{
mySize = size;
//myData is of type int*
myData = new int[mySize]; // this stuff is allocated on a heap
}
据我所知,这种情况下的默认复制构造函数将像这样实现:
Array::Array(Array& a)
{
mySize = a.mySize;
myData = a.myData; //points to the same memory on the heap
}
最后,假设我的 main.cpp 文件中有以下代码
int main()
{
Array a(1);
Array b(a); //copy constructor is invoked
}
我期望的是由于删除指向空闲存储内存的 myData 指针而导致的内存泄漏,但我有以下运行时错误:
*** glibc detected *** ./main.out: double free or corruption (fasttop): 0x086ad008 ***
为什么?似乎 ~Array() 以某种方式自动释放分配在堆上的内存 - 但这对我来说非常违反直觉。也许我错过了什么?
更新:
class Array{
private:
size_t mySize;
int *myData;
...
更新 2:
主.cpp:
#include <iostream>
#include "array.h"
int main()
{
Array a(1);
Array b(a);
}
数组.h:
#ifndef ARRAY_H_
#define ARRAY_H_
#include <stddef.h>
class Array{
private:
size_t mySize;
int *myData;
public:
Array(size_t size);
~Array();
void set(int i,int val);
int get(int i);
size_t getSize();
};
#endif
数组.cpp:
#include "array.h"
Array::Array(size_t size)
{
mySize = size;
myData = new int[mySize];
}
Array::~Array()
{
delete[] myData;
}
void Array::set(int i, int val)
{
if(i>=0 && i<mySize)
myData[i] = val;
}
int Array::get(int i)
{
if(i>=0 && i<mySize)
return myData[i];
else return -1;
}
size_t Array::getSize()
{
return mySize;
}