c++ - 为什么我的程序在这一行崩溃了?

标签 c++ c++11

#include <iostream>

using namespace std;

template <class T>
class myset{
private:
    T *pArray;
    int size;

public:
    myset<T>(){
        pArray = new T[0];
        int size =0;
    }

    void addItem(T iVal){
        size++;
        T* newArray = new T [size];// allocate bigger array //
        for(int i=0; i< size-1; i++){
            newArray[i] = pArray[i]; // IT IS CRASHING BECAUSE OF THIS LINE
        }
        pArray[size -1] = iVal;
        pArray = NULL;
        pArray = newArray;
    }
};

int main()
{
    myset<int> a;
    myset<double> d;
    a.addItem(3);
    a.addItem(5);
}

我想做的是制作一个任何模板的动态数组。在我的添加函数中,我试图将我的旧数组复制到我的新数组中。谁能告诉我为什么它不起作用?

最佳答案

在构造函数中,int size =0; 声明并初始化了一个名为size 的新局部变量。它没有初始化成员变量 myset::size。这意味着当构造 myset 时,myset::size 将包含垃圾。 IE。它可以从任何值开始。

此外,在 addItem 中,您将项目添加到旧数组而不是新数组,然后丢弃指向该数组的指针而不释放其内存,这会导致内存泄漏和新数组数组只包含垃圾。

关于c++ - 为什么我的程序在这一行崩溃了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44192692/

相关文章:

c++ - 跨shared_ptr的dynamic_cast?

c++ - 为什么我们需要引用折叠规则

c++ - g++ 产生空目标文件

c++ - unordered_map 的键

c++ - VS2015错误C2976

c++ - 有没有办法加快对以下表达式的评估?

c++ - Qt 应用程序意外的 LanguageChange 事件

c++ - 如何在字符串上使用 C++ 预处理器?

c++ - 给定我的自定义 const_iterator 实现自定义 const_reverse_iterator

c++ - begin() 和 end() 函数不应该是模板类 Vector 的成员函数吗?