从方法返回的数组的 C++ 段错误

标签 c++ arrays

我遇到了以下奇怪的行为,我无法弄清楚为什么它会不断发生,请考虑以下代码:

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;
}

现在我得到的输出是:

  1. 首先 - “0x1ea3c70”
  2. 第二个 - “酒吧”
  3. 第三个“0x1ea3c70”(相同地址 - 相同对象)
  4. 最后 - “段错误”

这怎么可能发生很明显我们指的是内存中的同一个对象,所以为什么在一个地方该方法有效而在其他地方我得到这个错误...

最佳答案

问题出在以下代码:

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/

相关文章:

c++ - 在 C++ 中为数组正确分配和释放内存

php - 删除文本文件中的重复行

C++ 对图形的像素级控制

c++ - 试图在对象内部创建指向前一个对象的指针

c++ - gcc 选项 "-fmessage-length"是什么意思?

c - 第 N 个元素的数组,尝试从左到右和从右到左添加元素

java - 以板格式将 2D 数组打印到控制台

c++ - 错误 :Unresolved external Symbol of d2d1effects. h DIRECTX 中的 CLSID_D2D1HueRotation 属性

c++ - 是否建议在函数中使用 using 关键字?

javascript - JavaScript 数组是关联的吗?