访问冲突写入位置0xCCCCCCC?

时间:2014-09-21 20:54:26

标签: c++ visual-studio-2012

当我尝试push_back任何元素时,它给出了错误" Project.exe中的0.x00D644AB处的未处理异常:0xC000005:访问冲突写入位置0xCCCCCCC。"我曾尝试寻找解决方案,但似乎找不到与我有关的解决方案。谢谢吨。

    SDAL(){
        T* list = new T(50);
        size1=50;
        numberOfElements=0;
    }

    void push_back( const T& element ) {
        numberOfElements++;
        if(numberOfElements>=size1-1){
            expandArray();
        }
        list[numberOfElements-1]=element;
    }

错误指向" list [numberOfElements-1] = element;"当我调试它时。

完整的代码在这里:

template <typename T>
 class SDAL {
 private:
     int size1;
     int numberOfElements;
     T* list;

 public:
    SDAL(){
        T* list = new T[50];
        size1=50;
        numberOfElements=0;
    }
    SDAL(int x){
        T* list = new T[x];
        size1=x;
        numberOfElements=0;
    }
    void expandArray(){
        int tmpSize = size1;
        size1=(int)((double)size1*1.5);
        T* tmp = new T[size1];
        for(int x=0; x<tmpSize; x++){
            tmp[x]=list[x];
        }
        list=tmp;
    }
    void push_back( const T& element ) {
        numberOfElements++;
        if(numberOfElements>=size1-1){
            expandArray();
        }
        list[numberOfElements-1]=element;
    }

2 个答案:

答案 0 :(得分:3)

Visual C ++在调试模式下使用0xcccccccc填充未初始化的内存,因为它更容易被捕获。因此,对0xcccccccc的访问进行捕获应该是非常有用的提示。

您的错误很简单:

您正在ctor中分配内存以存储容器元素,但是:

  • 您只为一个元素分配足够的资金。
  • 您将其分配给临时而非成员。

使用它因此仍然未初始化的指针将自然陷入您的第一次访问。

答案 1 :(得分:1)

要分配数组,请确保使用方括号:

    T* list = new T[50];
                   ^  ^

您当前的代码会分配一​​个T(并将其初始化为50)。

相关问题