我在玩我的容器。
在我的容器模板类中,我创建了一个指针T*
(T* mData;
)作为容器类的成员变量。这是指向数组类型的指针。
在析构函数中,我调用了delete
关键字delete mData;
或delete[] mData;
,但是我听到的只是测试应用程序中的叮当声,并且没有更多的输出写入控制台。
有人可以解释一下删除T* mData;
的成员与删除其他所有内容有何不同吗?如果可以的话,有人可以解释一下我到处都是,找不到答案。
更新
我阅读了评论,并且由于人们愿意提供帮助,因此我决定发布此更新并回答问题本身。 PS不会笑,这是一个愚蠢的错误。
旧代码(看起来像这样)
template<typename T>
class TestVector {
// members
T* mData;
size_t mSize;
// methods
void AddData(T data){
T* buffer;
memcpy_s(buffer, sizeof(mData), mData, sizeof(mData));
if(!buffer){
// log error
return;
}
mSize++;
SafeDelete(mData); // deleting this here was the problem (check destructor)
mData = new T[mSize];
mData = buffer;
mData[mSize - 1] = data;
}
// constructors
TestVector(void){
mData = new T[0];
ZeroMemory(mData, sizeof(mData);
mSize = 0;
}
~TestVector(void){
SafeDelete(mData); // when deleting the mData member again here the problem would occur, the destructor was called the beep noise would sound and the console window would freeze
}
// operators
};
我将回答为解决此问题所做的更改。 。 。
答案 0 :(得分:0)
我承认我不明白为什么多次删除该类的同一指针会导致错误,也许新指针的内存地址是该类不知道的,所以析构函数找不到它,而是解决我和老派C一起去的问题。
template<typename T>
class TestVector {
private:
T * mData;
size_t mSize = 0;
public:
TestVector(void) {
mSize = 2;
mData = (T*)malloc(mSize * sizeof(T));
for (int i = 0; i < mSize; i++) {
mData[i] = i;
}
cout << "Values in t1 are: " << mData[0] << ", " << mData[1] << endl;
}
~TestVector(void) {
free(mData); // only place the pointer is ever deleted
}
public:
void AddData(T data) {
mSize++;
T* newData = (T*)realloc(mData, mSize * sizeof(T));
mData = newData;
mData[mSize - 1] = data;
for (int i = 0; i < mSize; i++) {
cout << "Value: " << i << " is equal to: " << mData[i] << endl;
}
}
};
我只是使用malloc()
进行分配,realloc()
将更大的数组重新分配给指针,而free()
则释放了指针。
我可以忽略第一个版本中的SafeDelete(mData);
,而只是在顶部打上new
,但是我实际上更喜欢使用老派C来处理这种事情,这更有意义: )