C++ 指针已初始化,但我有错误“;访问冲突读取位置0xCCCC";。为什么?
我的函数C++ 指针已初始化,但我有错误“;访问冲突读取位置0xCCCC";。为什么?,c++,error-handling,initialization,C++,Error Handling,Initialization,我的函数zeroppadding有更多选项,但我只放了两个,因为它们对于本例很重要。当我调试main()函数时,我遇到了这个错误 Access violation reading location 0xCCCCCCCC 为什么? 这来自类信号,只是为了显示构造函数调用的内容 template <class T> Signal<T>::Signal(int width,int height){ N=width; M=height; sig2D=
zeroppadding
有更多选项,但我只放了两个,因为它们对于本例很重要。当我调试main()
函数时,我遇到了这个错误
Access violation reading location 0xCCCCCCCC
为什么?
这来自类
信号
,只是为了显示构造函数调用的内容
template <class T> Signal<T>::Signal(int width,int height){
N=width;
M=height;
sig2D= new int*[N];
for(int i=0;i<N;i++){
sig2D[i]=new int[M];
}
t0=0;
deltaT=1;
for (int i=0;i<N;i++)
for (int j=0;j<M;j++){
sig2D[i][j]=t0+j*deltaT;
}
}
模板信号::信号(整数宽度、整数高度){
N=宽度;
M=高度;
sig2D=新整数*[N];
对于(int i=0;i而言,代码中最严重的问题是,如果在零填充中,则只返回第一个,如果程序流入else,则会导致未定义的返回值
if(s1.getWidth()>s2.getWidth() && s1.getHeight()==s2.getHeight()){
im2.setWidth(s1.getWidth());
im2.sig2D=new T*[im2.getWidth()];
for(int i=0;i<im2.getWidth();i++){
im2.sig2D[i]=new T[im2.getHeight()];
}
for (int i=s2.getWidth();i<s1.getWidth();i++)
for(int j=0;j<s2.getHeight();j++){
im2.sig2D[i][j]=temp[j];
}
return im2; // <- return here
}
else if(s1.getHeight()<s2.getHeight() && s1.getWidth()>s2.getWidth()){
// what will it return if the code comes to here
setHeight(s2.getHeight());
sig2D=new T*[getWidth()];
for(int i=0;i<getWidth();i++){
sig2D[i]=new T[getHeight()];
}
for (int i=0;i<s1.getWidth();i++)
for(int j=s1.getHeight();j<s2.getHeight();j++){
sig2D[i][j]=temp[j];
}
(*this).zeroPadding(im2);
}
// or here
然后在中,如果再次创建新图像而不释放上一个图像,则
r=new Image(im2.getWidth(),im2.getHeight());
此外,您在使用分配的内存时没有检查NULL
sig2D= new int*[N];
for(int i=0;i<N;i++){
sig2D[i]=new int[M];
}
int *temp=new int[15];
for(int i=0;i<15;i++){
temp[i]=0;
如果新语句失败,则赋值也会失败。在代码中,您在上一行说它失败,而在注释中,您在中说它失败(*this)
:
当我调用(*r)=(*r)时为I。零填充(im2)而不是
(*r)=它通过了零填充(im2),所以r没有问题,问题是
我认为(*this)是在main()中初始化的,是吗
错了吗
是的,你错了。这个
只是指向当前对象的指针,不是真正的变量,因此如果对象存在,访问这个
总是成功的。但是如果r
没有初始化,那么注释中的行将不会继续运行
使用->
而不是(*x)。
将使您的代码更短、更干净
最后,请重新调整代码的缩进。在这种情况下,访问冲突读取位置0xCCCC
表示您正在取消对未初始化指针的引用。请使用调试器!同时使用(*this)停止它。
并改用this->
。尝试valgrind或类似的int temp[]={0};
此数组中只有一个元素。然后您将尝试访问temp[j]<代码> j >代码< j/<代码>除了<代码> 0代码>之外,还有其他的值,如果有一个访问冲突读取一个位置,问题不应该是什么,<>代码> r>代码>,而是C++不支持在<代码> n=宽度中的隐含int;m=身高;< /Cord>。把它放到try-and-catch块(catch就像这个catch(std::bad_alloc&){我能同意你的观点吗,我不需要(*这个)。zeroPadding。我没有把整个函数放在zeroPadding中,因为它很大,所以我只把这个例子中执行的一部分放在main中。所以我在这个例子中的zeroPadding从else if开始,如果在else if(*this)的末尾.zeroPadding(im2)被调用。在第一部分之后,执行od zeroPadding(如果部分)。因此,没有必要在else if中使用return,因为在else if的末尾,我将再次调用zeroPadding,这将使用return执行函数的一部分。我将try和catch放在我使用new的每个地方,我没有捕捉到错误。您的假设是错误的。如果再次递归调用它,则结果将被调用方使用,这(*this).zeroppadding(im2);
被此行丢弃,而没有返回外部调用方。如果需要尾部递归,请使用return(*this).zeroppadding(im2);
imagineinta(intn){If(somecondition)返回n;else a(n-1);}
,如果控制转到“其他”,则不会返回任何内容。打开所有警告并查看@Lưu Vĩnh Phúc您的操作正确。我现在没有错误。谢谢。
r=new Image(im2.getWidth(),im2.getHeight());
sig2D= new int*[N];
for(int i=0;i<N;i++){
sig2D[i]=new int[M];
}
int *temp=new int[15];
for(int i=0;i<15;i++){
temp[i]=0;
(*r)= zeroPadding(im2); // here breaks why?