无法调整c ++ std :: vector的大小,它是类的成员变量

时间:2013-03-13 07:23:37

标签: c++ vector segmentation-fault stdvector c++-standard-library

代码(简化版)

(部分)类定义:

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;
<{1>}函数中的

main

稍后在std::cin>>k; bar.resize(k); 函数中,调用另一个访问main的成员函数(foo),导致data {{1} })。

调试后,我发现segmentation fault返回0.这是非常意外的。

经过一段很长的调试后,我对segsegv问题非常有信心,这不应该导致任何问题(毕竟它来自标准库!)。

P.S。不要指责我将任何东西放在全球范围内或让公众可以访问班级成员。我不是在写任何“真正的”程序,因为我只是在参加编程比赛。

2 个答案:

答案 0 :(得分:5)

  

经过一段很长的调试后,我对resize

的问题非常有信心

几乎可以肯定:

  1. 此问题与resize()没有任何关系。
  2. 你在某处有一个与内存有关的错误(双删除,未初始化/悬空指针,缓冲区溢出等)。
  3. 与内存相关的错误之处在于,在错误的代码完成损坏之后,它们才能完全无症状。

    我的建议是在valgrind下运行您的程序(或者至少向我们展示一个对您不起作用的SSCCE)。

答案 1 :(得分:1)

以下对我来说没问题

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