簡體   English   中英

無法調整為類的成員變量的c ++ std :: vector的大小

[英]cannot resize c++ std::vector that's a member variable of a class

代碼(簡體版)

(部分)類定義:

struct foo {
    std::vector<int> data;
    foo(int a=0):data(a+1,0) {}
    void resize(int a) {
        data.resize(a+1,0);
    }
}

a+1部分是因為我希望對data進行1索引以簡化某些操作。

在全球范圍內:

int k;
foo bar;

main功能上:

std::cin>>k;
bar.resize(k);

稍后在main函數中,將調用另一個訪問data成員函數(在foo ),從而導致segmentation faultsegsegv )。

調試后,我發現data.size()返回0。這是非常意外的。

經過很長時間的調試后,我非常有信心問題在於resize ,這不會造成任何問題(畢竟是來自標准庫!)。

PS不要指責我將任何內容放到全球范圍內或將公開訪問權授予班級成員。 我沒有編寫任何“真實”程序,因為我只是在參加編程比賽。

經過很長時間的調試后,我非常有信心問題在於resize

幾乎可以肯定的是:

  1. 這個問題與resize()沒有任何關系。
  2. 您在某處存在與內存相關的錯誤(重復刪除,未初始化/懸掛的指針,緩沖區溢出等)。

與內存相關的錯誤的原因是,直到錯誤代碼損壞后,它們才可能完全沒有症狀。

我的建議是在valgrind下運行您的程序(或至少向我們展示對您不起作用的SSCCE )。

以下對我有用

#include <vector>
#include <cstdlib>

struct foo {
  std::vector<int> data;
  explicit foo(int a=0) : data(a+1, 0) {}
  void resize(int a) {
    data.resize(a+1, 0);
  }
};

int main() {
  foo test_foo(1);

  for (size_t i = 0; i < 1000; ++i) {
    int a = std::rand() % 65536;
    test_foo.resize(a);
    if (test_foo.data.size() != a + 1)
      return 1;
  }

  return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM