C++ 访问冲突写入位置0xCCCCC?
当我尝试推回任何元素时,它会给出错误“Project.exe中0.x00D644AB处的未处理异常:0xC000005:访问冲突写入位置0xCCCCC”。我尝试寻找解决方案,但似乎找不到与我相关的解决方案。谢谢你C++ 访问冲突写入位置0xCCCCC?,c++,visual-studio-2012,C++,Visual Studio 2012,当我尝试推回任何元素时,它会给出错误“Project.exe中0.x00D644AB处的未处理异常:0xC000005:访问冲突写入位置0xCCCCC”。我尝试寻找解决方案,但似乎找不到与我相关的解决方案。谢谢你 SDAL(){ T* list = new T(50); size1=50; numberOfElements=0; } void push_back( const T& element ) {
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;
}
模板
类SDAL{
私人:
国际尺寸1;
整数元;
T*列表;
公众:
SDAL(){
T*list=新的T[50];
尺寸1=50;
numberOfElements=0;
}
SDAL(int x){
T*list=新的T[x];
尺寸1=x;
numberOfElements=0;
}
void expandArray(){
int-tmpSize=size1;
尺寸1=(整数)((双)尺寸1*1.5);
T*tmp=新的T[size1];
对于(int x=0;x=size1-1){
expandArray();
}
列表[numberOfElements-1]=元素;
}
要分配数组,请确保使用方括号:
T* list = new T[50];
^ ^
您当前的代码分配一个单独的<代码> t>代码>(初始化为50)。 VisualC++在调试模式下用0xccccccc填充未初始化的内存,因为这更容易被捕获。因此,对0xccccccCC的访问应该是一个非常有用的提示。 您的错误很简单: 您正在ctor中分配内存以存储容器元素,但是:
- 您只为一个元素分配足够的资源
- 您可以将其指定给临时成员,而不是成员
使用仍然未初始化的指针自然会在第一次访问时陷入陷阱。这是
std::vector
的一个完美用例。当访问冲突异常发生时,您可以调试并查看导致异常的指令。您能调试程序吗?为什么决定省略大部分代码?您可能很容易就遇到了e显示了一个完整的程序。为什么size1-1
?您在什么时候为list
分配内存作为数组?您知道,泄漏存储在ctor容器中的元素的内存是没有用的。谢谢,我试过了,但我仍然得到了相同的结果error@user3272701:猜一猜,在其他部分中查找相同的错误用户3272701请不要要求我们调试您的代码,我们看不到的代码。我们可以回答您提出的问题。如果您提出了不好的问题,那是您的问题。这就是问题中代码的问题。如果您的代码中有错误,请调试它。请在您提出问题时尝试倾听答案。这有什么意义问然后忽略答案。你犯了很多次同样的错误。仅仅纠正一个错误是不够的。如果你一次又一次地犯错误,你每次都必须纠正它。为什么你不阅读你自己的代码。还有这个答案。我正在阅读你们给出的所有建议,但问题仍然存在,如果看起来是这样的话,对不起好像我没有尝试,但我已经做了几个小时了。为了详细说明临时部分的赋值:在构造函数中执行T*list=new T[50];
是声明一个名为list
的局部变量,它隐藏了同名的成员变量。相反,它应该是list=new T[50];
以便使用成员。