カスタム 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
配列.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;
}