访问冲突0xFEEEFEEE无法访问组件
Access violation 0xFEEEFEEE cannot access components
在返回带有指向 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
。
相关文章:
- 通过方法访问结构
- 使用不带参数的函数访问结构元素
- 在C++中访问蓝图类组件的正确方法是什么?
- 如何访问基类向量中的子类变量?(对于实体组件系统)
- 从 WinRT C++组件访问 COM 对象
- 如何访问头文件中类的组件并打印它们的地址?
- 让 Redhawk 组件访问另一个组件的属性
- OpenCL 矢量类型:在启用 C++11 的情况下无法访问联合组件 x,y,z
- 访问QT上的本地用户文件进行Web组件
- 从C++访问现有的 QML 组件
- 通过浏览器使用 Java/C 访问 HTML TextField 组件
- 切换到具有不同数量的标量组件的图像会导致访问违规
- 有关C++/组件数据布局、数据成员访问、方法的一般问题
- 访问冲突0xFEEEFEEE无法访问组件
- 如何访问加载的映像的各个 R/G/B 组件(较新的 C++ API)
- 通过 [ " " ] 或 [int] 为自定义类C++访问组件
- 如何从实体组件系统的子类中访问属性
- 如何设计一个应该同时从C++和C#访问的组件
- c++实体组件系统和使用模板访问组件
- 通过windows phone 8.1运行时组件访问CoreWindow