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);
imagine
inta(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?