【问题标题】:Strange vector initialization issue奇怪的向量初始化问题
【发布时间】:2010-02-19 07:15:46
【问题描述】:

我最近调试了一个奇怪的 C++ 问题,其中一个新声明的向量不知何故具有 477218589 的大小。这是上下文:

struct Triangle {
    Point3 a,b,c;
    Triangle(Point3 x, Point3 y, Point3 z) : a(x), b(y), c(z) {}
    Vector3 flat_normal() { return (a-c)^(b-c); }
};

vector<Triangle> triangles;

调用triangles.size() 返回值477218589。 我通过将struct Triangle 更改为class Triangle 来“解决”问题,但我想知道为什么会有任何不同。我应该这样做typedef struct Foo { ... } Foo;魔术吗?如果是这样,为什么会有帮助?

如果重要的话,我使用的是 g++-4.1。

【问题讨论】:

  • 您所描述的可以安全地称为“不太可能”,原因不止一个。显然,您没有发布整个代码。不,将struct 更改为class 不会解决问题,如果有的话,除了会导致重新编译翻译单元。
  • 如果你想在调试过程中可靠地观察变量,你必须关闭优化。如果是程序本身输出了错误的值,请发布一个显示该行为的最小可编译 sn-p。
  • 好吧,我无法在其他地方重现该错误,所以显然它不存在! :-P 无论如何,谢谢。

标签: c++ vector struct


【解决方案1】:

这个

#include <vector>
#include <iostream>

struct Point3 {};

struct Triangle {
    Point3 a,b,c;
    Triangle(Point3 x, Point3 y, Point3 z) : a(x), b(y), c(z) {}
};

int main()
{
    std::vector<Triangle> triangles;

    std::cout << triangles.size() << '\n';

    return 0;
}

为我打印0。如果它也适合您,那么问题出在此 sn-p 中未包含的部分代码中。如果它打印出其他任何内容,则说明您的编译器/标准库/设置有问题。

【讨论】:

  • 好吧,这是事后的想法:您不能使用带有std::vector 的类型,除非它提供了默认构造函数。 (我的编译器没有检测到这一点,因为代码 sn-p 从不尝试填充向量。)由于 Triangle 不提供默认构造函数,从技术上讲,它可能会调用未定义的行为。
  • 只有在调用方法并希望使用默认值时才需要默认构造函数。 vec.resize(10); - 需要默认构造函数,否则无法编译,vec.resize(10, Something(x, y)); - 不需要默认构造函数。
  • @UncleBens:感谢您的澄清!
【解决方案2】:

Triangle 声明为结构或类之间应该没有任何区别 - 在 C++ 中,两者之间的区别在于成员的默认访问规范对于结构是公共的,对于类是私有的,仅此而已.

Triangle 是否还有其他您未包含的内容?

【讨论】:

  • 我也不认为有区别!我已经添加了Triangle 的全部内容。 Point3Vector3 是简单的类。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-22
  • 2021-09-07
  • 2017-05-18
  • 2021-12-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多