C++ std::string中的堆损坏?
我的代码因std::string中的堆损坏而失败?C++ std::string中的堆损坏?,c++,C++,我的代码因std::string中的堆损坏而失败? string unsigned_int_to_string(unsigned int in) { using namespace boost::spirit; using boost::spirit::karma::generate; char x[65]; char *p = x; generate(p, uint_, in); *p = '\0'; return string(x)
string unsigned_int_to_string(unsigned int in)
{
using namespace boost::spirit;
using boost::spirit::karma::generate;
char x[65];
char *p = x;
generate(p, uint_, in);
*p = '\0';
return string(x);
}
如果我在Windows7电脑上运行我的程序,它可以正常工作,但在Windows8.1电脑上它会在随机的地方崩溃。我不明白为什么堆会损坏?是否有可能我的RAM出现故障或任何其他程序导致问题 腐败至少发生在两种情况下: a)
threadex.c
(代码太长,无法发布)b)
free.c
由xstring
调用(如上所示的代码太长,无法发布更多内容)您的bug位于其他地方,而不是此函数内部
很可能
s
和/或d
已损坏。如果看不到更多的代码,就不可能知道原因。如果我不得不猜测,我会认为它们的内存已经被释放(例如,如果它们是类对象的一部分,并且该类对象已经被删除)。或者可能是另一段代码出错并覆盖了它们的内存。您的错误在其他地方,而不是在这个函数中
很可能
s
和/或d
已损坏。如果看不到更多的代码,就不可能知道原因。如果我不得不猜测,我会认为它们的内存已经被释放(例如,如果它们是类对象的一部分,并且该类对象已经被删除)。或者可能是另一段代码出错并覆盖了它们的内存。首先,使用boost::spirit::karma::generate
返回字符串不需要首先使用字符缓冲区:
std::string unsigned_int_to_string(unsigned int value)
{
using namespace boost::spirit;
using boost::spirit::karma::generate;
std::string str;
generate(std::back_inserter(str), uint_, value);
return str;
}
可能发生的情况:在代码中的某个地方,x
(是一个固定大小的未初始化字符数组)被访问超出其边界。这将导致你破坏记忆,然后一切都可能发生
如果没有发生这种情况,您可能会在代码的其他位置浪费内存,从而导致未定义的行为
长话短说:您正在代码的某个地方调用未定义的行为
另一方面,如果您使用的是符合C++11标准的编译器,则该编译器已经存在。首先,使用
boost::spirit::karma::generate
返回字符串不需要首先使用字符缓冲区:
std::string unsigned_int_to_string(unsigned int value)
{
using namespace boost::spirit;
using boost::spirit::karma::generate;
std::string str;
generate(std::back_inserter(str), uint_, value);
return str;
}
可能发生的情况:在代码中的某个地方,x
(是一个固定大小的未初始化字符数组)被访问超出其边界。这将导致你破坏记忆,然后一切都可能发生
如果没有发生这种情况,您可能会在代码的其他位置浪费内存,从而导致未定义的行为
长话短说:您正在代码的某个地方调用未定义的行为
另外,如果您使用的是符合C++11标准的编译器,它已经存在。我非常怀疑您的RAM是否出现故障。你能再发一些代码吗?什么是
d
?它只是在你的代码中突然出现。。。“完成示例”是个好主意,这是我们可以发布到编译器中重现问题的最小行数您正在将(C)字符串截断为长度0…是的,但我不关心p,因为我使用x作为返回值。通常,如果您希望从generate
中获得std::back\u insert\u iterator
作为第一个参数,而不是指向字符缓冲区的指针。如果我不得不猜测,我会说你的问题是你超出了你分配的缓冲区。如果您切换到使用back_insert_迭代器方法,您的问题可能会消失。我非常怀疑您的RAM是否出现故障。你能再发一些代码吗?什么是d
?它只是在你的代码中突然出现。。。“完成示例”是个好主意,这是我们可以发布到编译器中重现问题的最小行数您正在将(C)字符串截断为长度0…是的,但我不关心p,因为我使用x作为返回值。通常,如果您希望从generate
中获得std::back\u insert\u iterator
作为第一个参数,而不是指向字符缓冲区的指针。如果我不得不猜测,我会说你的问题是你超出了你分配的缓冲区。如果您切换到使用back\u insert\u迭代器方法,您的问题可能会消失。@Luka Undefined behavior是,Undefined。它可能很好用。。。或者它可以点比萨饼,或者重新格式化你的硬盘,或者给你所有的前女友打电话。由于它是未定义的行为,所有这些选项(以及任何其他选项)都同样有效。感谢您提供的信息,我发布了两个发生损坏的案例。@ZacHowland,如果我的代码将比萨饼作为未定义的行为订购,我将编写更多更糟糕的代码。我可能会被炒鱿鱼。。但是pizza…@Moo Juice标准中没有任何内容可以阻止调用UB的代码为您订购pizza;)@卢卡未定义的行为是,未定义的。它可能很好用。。。或者它可以点比萨饼,或者重新格式化你的硬盘,或者给你所有的前女友打电话。由于它是未定义的行为,所有这些选项(以及任何其他选项)都同样有效。感谢您提供的信息,我发布了两个发生损坏的案例。@ZacHowland,如果我的代码将比萨饼作为未定义的行为订购,我将编写更多更糟糕的代码。我可能会被炒鱿鱼。。但是pizza…@Moo Juice标准中没有任何内容可以阻止调用UB的代码为您订购pizza;)