【发布时间】:2013-03-06 21:52:58
【问题描述】:
假设我创建了一个自定义 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:
main.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
array.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;
}
【问题讨论】:
-
你是说你的析构函数没有释放内存吗?如果是这样,则很难理解错误。
-
What is The Rule of Three? 的可能重复项
-
我是说析构函数可能会释放指向堆的内存,它不应该......至少据我所知。
-
析构函数不会做这样的事情,除非你告诉它。可以发sscce吗?
-
你能发布整个课程吗?您是否定义了赋值运算符?析构函数?自定义
delete实现?Array有什么子类吗?
标签: c++ gcc c++11 gcc-warning