访问冲突0xFEEEFEEE无法访问组件

Access violation 0xFEEEFEEE cannot access components

本文关键字:访问 组件 0xFEEEFEEE 访问冲突      更新时间:2023-10-16

在返回带有指向 Foo 类的指针的 Foo1 对象后,我遇到了访问冲突错误。 函数 Foo2::something(int) 的结果是 Foo1 对象。问题是:Foo** array Foo2::something(int)结果是无法访问的。

class Foo{
  int x;
public: 
  int getX() { return x; }
 Foo& operator=(const Foo &rhs){
  x = rhs.x; 
  return *this;
}
};
class Foo1{
  Foo** array;
  int size;
public:
  Foo1(int size){
   array = new Foo*[size]
   for(int i=0; i < size;i++)
       array[i] = new Foo[size];
  }  
 Foo1(const Foo1& foo): array(foo.array), size(foo.size){}
 ~Foo1(){
    for(int i=0; i < size);i++)
       delete[] array[i];
    delete[] array;
  }
 Foo getFoo(int x, int y){
    return array[x][y];
 }
 void setFoo(int x,int y,Foo foo){
    array[x][y] = foo;
 }
 Foo1& operator=(const Foo1& foo){
   array = foo.array;
   size = foo.size;
 }
};
class Foo2{
public:
  Foo1 something(int size){
    Foo1 obj(size);
    return obj;         
  }
};
int main(){
 Foo2 foo2;
 Foo1 obj = foo2.something(3);
 obj.getFoo(0,0).getX(); // <- access violation here 
}
Foo1 something(int size){
  Foo1 obj(size);
  return obj;         
}

创建一个对象obj并返回它。让我们检查一下你的复制构造函数是否负责复制数据:

Foo1(const Foo1& foo): array(foo.array), size(foo.size){}

这是一个浅层副本:数组的内容不会被复制,相反,临时对象和main中的Foo1 obj都将具有指向相同数据的成员array。但是,之后会发生什么?

Foo1 obj = foo2.something(3);
//    what happens here      ^^^^^ ?

到那时,something obj将被摧毁。因此,将调用其析构函数。这个析构函数会删除数组的内容。

要么

进行深层复制(分配新内存并复制数组),要么使用引用计数(以确保不会过早删除数组),要么使用 std::vector< std::vector<Foo> > 或类似的东西来隐藏管道。

进一步说明:启用编译器警告。您的大多数非 void 函数不使用 return