我遇到了以下奇怪的行为,我无法弄清楚为什么它会不断发生,请考虑以下代码:
class bar{
private:
std::string name;
public:
bar():name("bar"){};
std::string getName(){return name;};
};
class foo{
private:
bar local_arr[2];
bar** heapArr;
public:
foo(){};
void populate(){
cout<<&local_arr[0]<<endl; //first
cout<<local_arr[0].getName()<<endl; //second
heapArr = new bar*[2];
for(int i=0;i<3;i++){
heapArr[i] = new bar();
}
};
bar* getLocal(){
return local_arr;
};
bar** getHeap(){
return heapArr;
}
};
int main()
{
bar* b = new bar();
foo & f = *(new foo());
f.populate();
bar* local = f.getLocal();
bar** heap = f.getHeap();
cout<<&local[0]<<endl;//third
cout<<local[0].getName()<<endl;//last
return 0;
}
现在我得到的输出是:
- 首先 - “0x1ea3c70”
- 第二个 - “酒吧”
- 第三个“0x1ea3c70”(相同地址 - 相同对象)
- 最后 - “段错误”
这怎么可能发生很明显我们指的是内存中的同一个对象,所以为什么在一个地方该方法有效而在其他地方我得到这个错误...
最佳答案
问题出在以下代码:
heapArr = new bar*[2];
for(int i=0;i<3;i++){
heapArr[i] = new bar();
}
heapArr
被创建为一个只有 2 元素的数组,但是下面的 for
循环试图访问第三个元素,即它是离开数组的边界然后导致 UB , 意味着一切皆有可能。对于您的情况,内存似乎已损坏。
改成
for(int i=0;i<2;i++){
heapArr[i] = new bar();
}
关于从方法返回的数组的 C++ 段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48577383/