c ++ template <typename t =“”>删除

时间:2018-07-14 02:26:57

标签: c++ delete-operator

我在玩我的容器。

在我的容器模板类中,我创建了一个指针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
};

我将回答为解决此问题所做的更改。 。 。

1 个答案:

答案 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来处理这种事情,这更有意义: )