【问题标题】:Getting SIGSEGV/SIGABRT when allocating memory for a string为字符串分配内存时获取 SIGSEGV/SIGABRT
【发布时间】:2011-05-12 09:46:54
【问题描述】:

真的不知道该怎么做——当我为一个字符串分配内存时,我的程序不断崩溃,最常见的是在这段无害的代码中,而在其他情况下这从来没有引起过问题:

template <class T>
inline string to_string (const T& t, bool use_fixed = false)
{
    stringstream ss;
    if (use_fixed) ss.setf(ios::fixed, ios::floatfield);
    ss << t;
    return ss.str();
}

特别是它在'ss

0   ??  
1   malloc
2   operator new(unsigned int)
3   std::string::_Rep::_S_create(unsigned int, unsigned int, std::allocator<char> const&)
4   std::string::_Rep::_M_clone(std::allocator<char> const&, unsigned int)
5   std::string::reserve(unsigned int)
6   std::basic_stringbuf<char, std::char_traits<char>, std:allocator<char> >::overflow(int)
...

现在我能想到的唯一可能与我的程序不同的事情是它有多个线程,并启动一个具有多个线程的子进程并调用此函数。我在 Ubuntu 10.04 上。感谢您的考虑--

马特

【问题讨论】:

  • 您可以发布完整的堆栈跟踪吗?如果没有更多的上下文,很难说发生了什么。所涉及的错误也完全有可能与它表现出来的代码无关。我的猜测是某处的数组边界溢出。你可以尝试在 Valgrind 或 DUMA 中运行你的程序,看看你想出了什么。
  • 不幸的是,在我的声誉 >= 10 并且我可以发布屏幕截图之前,完整的堆栈跟踪是不可行的。 :) 我以前从未使用过 valgrind,我会看看的。
  • 你知道发生了什么吗?
  • @highBandWidth 不,我认为随着我进行其他更改,问题会自行消失。但是对于 C++11 和 std::to_string,这个问题现在已经没有实际意义了。

标签: c++ string malloc new-operator


【解决方案1】:

发生这种情况时的标准答案是“您正在以某种方式破坏内存分配器内部数据结构”,这就是它崩溃的原因。检查你的数组边界,因为如果你在内存块的绑定之外写,你可能会覆盖你不应该覆盖的东西。

【讨论】:

  • 对。但我怎么能这样做呢?字符串刚刚发生这种情况的一个例子(虽然不是 to_string)是 void MyClass::Member { string str; ... str = "这是一个字符串"; },作业发生崩溃。 str 是本地的,不会影响任何东西。
  • 很简单:char *p = new char[2]; p[2] = 'c';这是写在不该写的地方。
  • 我使用的是 std::string,而不是 char*。 STL 正在做所有的分配。那么我怎么能让 STL 搞砸呢?
【解决方案2】:

其实 Matias Valdenegro 给了你正确的答案。但是,他以一种你不理解的方式做到了:他说你正在以某种方式破坏内存分配器的内部数据结构。这正是你所做的。 唯一不明白的事情(Matias 没有告诉你):你没有破坏你在这里引用的代码中的堆。您在某处else 破坏了堆。引用的代码只是触发中止信号,因为这是分配器功能(即新运算符)检测的点,您的堆已损坏(其他地方)。这就是为什么 - 与您的评论相反 - C++'es std::to_string 在这里根本没有帮助(如果您破坏堆,它也会 SIGABRT),这就是为什么当您正在处理某事时该错误突然消失了其他地方。您显然只是首先修复了导致堆损坏的错误。

找到这种错误的一个很好的工具叫做 valgrind,如果你还不知道它,你当然应该改变它,因为它不仅会告诉你发生了什么,而且还会告诉你实际发生在哪里错误存在。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-22
    • 2016-03-25
    • 2018-06-16
    • 2016-07-01
    • 2012-07-10
    • 2022-01-11
    • 1970-01-01
    • 2021-07-27
    相关资源
    最近更新 更多