2014-09-21 126 views
-2

当我尝试push_back任何元素时,它会给我提示错误“Project.exe中0.x00D644AB处未处理的异常:0xC000005:访问冲突写入位置0xCCCCCCC”。我试过寻找解决方案,但似乎找不到与我有关的解决方案。谢谢吨。访问冲突写入位置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; 
    } 

错误指向 “列表[numberOfElements-1] =元素;”当我调试它。

完整的代码是在这里:

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

“std :: vector”的完美用例。 – chris 2014-09-21 20:56:13

+1

当访问冲突异常发生时,您可以调试并查看导致异常的指令。你可以调试你的程序吗? – Dialecticus 2014-09-21 20:57:37

+1

你为什么决定省略大部分代码?你可以很容易地显示出一个完整的程序。为什么'size1-1'? – 2014-09-21 20:59:26

回答

1

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

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

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

+0

谢谢,我试过了,但我仍然得到相同的错误 – user3272701 2014-09-21 21:01:55

+0

@ user3272701:猜测,在代码的其他部分查找相同的错误。 – NPE 2014-09-21 21:03:12

+2

@ user3272701请不要要求我们调试您的代码,我们无法看到的代码。我们可以回答你问的问题。如果你提出不好的问题,那就是你。这是问题中的代码问题。如果您的代码中存在错误,请进行调试。当你问的时候也请试着听听答案。有什么要求然后忽略答案。你多次犯了同样的错误。仅仅修复你的一个错误是不够的。如果你一次又一次犯错,你必须每次修复它。你为什么不读你自己的代码。而这个答案。 – 2014-09-21 21:06:04

3

Visual C++在调试模式下使用0xcccccccc填充未初始化的内存,因为这很可能会被捕获。因此陷入对0xcccccccc的访问应该是相当有用的提示。

你的错误很简单:

您在构造函数分配内存来存储您的容器元素,但:

  • 你只分配足够的一个元素。
  • 您将其分配给临时而不是成员。

使用这个仍然未初始化的指针自然会陷入你的第一次访问。

+0

详细说明对临时部分的赋值:在构造函数中做'T * list = new T [50];'声明一个名为'list'的局部变量,它隐藏了同名变量。相反,它应该是'list = new T [50];'以便使用该成员。 – TheUndeadFish 2014-09-21 23:18:28