Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::string中的堆损坏?_C++ - Fatal编程技术网

C++ 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)

我的代码因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);
}

如果我在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;)