-3

我在玩我的容器。

在我的容器模板类中,我将T*( T* mData;) 的指针作为容器类的成员变量。这是一个指向数组类型的指针。

在析构函数中,我调用了delete关键字delete mData;ordelete[] 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
};

我将回答我所做的以将其更改为问题的答案。. .

4

1 回答 1

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 来处理这种类型的事情,它更有意义:)

于 2018-07-14T19:03:22.187 回答