为啥 C++ 标准向量在分配或调整大小时会出现段错误? [关闭]

Posted

技术标签:

【中文标题】为啥 C++ 标准向量在分配或调整大小时会出现段错误? [关闭]【英文标题】:Why would the C++ std vector segfault on assignment or resize? [closed]为什么 C++ 标准向量在分配或调整大小时会出现段错误? [关闭] 【发布时间】:2013-01-07 16:41:50 【问题描述】:

这是一个会产生分段错误的最小代码。

#include<vector>
int main() 
  std::vector<double> a;
  a.resize(10);
  return 0;

显然这段代码没有任何问题。我已经在几个系统上运行它没有问题,但它在我的工作电脑上产生了分段错误。

代码是在运行 openSUSE 11.1 的系统上使用 g++ file.cpp 编译的。我知道这是一个较旧的操作系统,但我不允许升级或重新安装。我唯一有权使用的是 zypper(用于安装和删除程序的命令行实用程序)。

我的假设是它与 c++ 库有关。我已经尝试重新安装所有我能想到的与 gcc/g++ 和 libstdc++ 相关的东西,但我仍然看到同样的问题。

以前有人见过这样的东西吗?有什么想法吗?

谢谢!

【问题讨论】:

除了操作系统严重损坏之外,想不出任何原因。 尝试重新启动您的系统?搞砸了 您是否考虑过使用调试器并找出崩溃的确切位置? 这个问题在 Windows 和 Unix 中都很常见(至少当你在 Unix 下使用 g++ 时——Sun CC 避免了它......通过维护一个极其过时的标准库接口)。 libstdc++ 的不同版本不兼容二进制(虽然我很惊讶看到 std::vector 的问题)。 @LightnessRacesinOrbit 我不知道。在 VC++ 10 之前的版本中,如果您不使用调试构建的默认选项,std::string 将会崩溃。不是系统的,只是在一些奇怪的功能上。 【参考方案1】:

您在哪里构建和链接应用程序?用什么 选项?如果您正在动态链接 C++ 标准 库,你很容易遇到问题; C++ 标准 库以破坏二进制的方式发生了多次更改 兼容性,和二进制兼容性可能会受到影响 编译器选项也是如此。一般来说,您应该使用 选项-static-libstdc++ 构建时,避免这样的 问题。 (请注意,对于系统,不是 库,动态链接是首选。)

【讨论】:

以上是关于为啥 C++ 标准向量在分配或调整大小时会出现段错误? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Imagemagick 或 GraphicsMagick 在调整为较小尺寸时会增加我的 PNG 图像的 MB 大小?

c++ 中将标准输入内容读入字符串或向量的最快方法

C++ priority_queue 底层向量容器容量调整大小

C++:为向量中的非连续索引赋值?

为啥存储此向量时会出现分段错误?

为啥 twitter 在调整大小时会在 Google Chrome 上启动“打嗝”?