C++ 吸气剂返回故障
在level.hh文件中想象一下:C++ 吸气剂返回故障,c++,segmentation-fault,getter,C++,Segmentation Fault,Getter,在level.hh文件中想象一下: Class Level { private: int size; float** a_predefined_2d_array; public: int GetSize(); int SetSize(int); int DoSomething(); int Load(string, int); }; 想象一下,在level.cc文件中: int Level::GetSize() { return size
Class Level {
private:
int size;
float** a_predefined_2d_array;
public:
int GetSize();
int SetSize(int);
int DoSomething();
int Load(string, int);
};
想象一下,在level.cc文件中:
int Level::GetSize() {
return size;
}
int Level::SetSize(int _size) {
size = _size
}
int Level::Load(string str, int _size) {
SetSize(_size); //works fine!
cout<<GetSize()<<endl; //works fine!
//basically loads everything to initiliaze the program. The point is that the above calls work fine!
}
//The problem is here!!!
int Level::DoSomething() {
a_predefined_2d_array = new float*[GetSize()]; //SEG FAULTS!!!
cout<<"size = "<<GetSize()<<endl; //SEG FAULTS!!!
}
int-Level::GetSize(){
返回大小;
}
整数级别::设置大小(整数大小){
大小=\u大小
}
int-Level::Load(字符串str,int\u大小){
SetSize(_size);//工作正常!
cout如果在调用DoSomething()
之前为size
赋值,则不会得到segfault
是一个在GCC上编译和运行的具有最小更改(包括简单的零初始化)的示例
Level l{};
l.DoSomething();
到目前为止看起来还不错(除了缺少一个;
)。但是,我看不到任何保证将大小设置为某个值?除此之外,我认为缺少一些实际导致segfault的代码。注意:您还缺少a_预定义的\u 2d_数组的定义。
。如果您可以发布一个。变量“size”的值是多少在发生异常时?我想一定是一些垃圾值。你是谁来定义什么是重要的部分?你不确定是什么导致了它。我关注的是真正的问题,你的大小保证在哪里设置正确?使用unsigned作为内存大小绝对是防止垃圾大小的一个很好的实践。@veda sounds似是而非。@Pavlos你在用什么编译器?我问是因为它真的不应该这样编译。而且Class
不是关键字,Class
是,所以这也让人困惑…有趣。我不知道使用{}
将默认初始化成员变量,而不使用它将使它们处于未初始化状态。感谢您抽出时间。请花些时间看看我在github上的代码。我在说明中提供了这些代码。我已添加了有关问题信息文件说明的注释,以指导您。@R2退出队列我可以再问您一个问题吗?我可以这样与您联系吗我如何通过电子邮件或其他方式回答?@Pavlos如果它很短,我可能可以在这里回答,或者你可以提出一个新问题。你永远不知道,其他人可能会发现这个答案在这条路上很有帮助。@caps OCD=>是的。检查标准第8.5小节中的初始值设定项。在这种情况下,大括号意味着列表初始化=>值初始化(8.5.4/3,第二个列表项)=>零初始化(8.5/8,第二个列表项)。当未提供初始值设定项(T name;
)时,默认初始化将执行8.5/12,在本例中也是如此)为成员提供不确定的值。但是,如果实现愿意,可以决定将其归零,这将使所有操作都相同。对详细信息进行了总结。是的,但在调用Load方法()时会添加一个值,我在执行某些操作之前会这样做