Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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++ EXC_坏访问使用<&书信电报;关于stringstream对象_C++_String_Stringstream - Fatal编程技术网

C++ EXC_坏访问使用<&书信电报;关于stringstream对象

C++ EXC_坏访问使用<&书信电报;关于stringstream对象,c++,string,stringstream,C++,String,Stringstream,我正在写一段代码,需要在内存中写入一个大字符串。 我使用了一个stringstream对象来执行此操作,但发生了一些奇怪的事情:即使底层字符串缓冲区的大小没有超过字符串对象的最大大小,我的程序也会因错误而崩溃 我创建了一个测试程序,如下所示: #include <sstream> // std::stringstream #include <iostream> // std::cout int main(int argc, const char * argv[]) {

我正在写一段代码,需要在内存中写入一个大字符串。 我使用了一个stringstream对象来执行此操作,但发生了一些奇怪的事情:即使底层字符串缓冲区的大小没有超过字符串对象的最大大小,我的程序也会因
错误而崩溃

我创建了一个测试程序,如下所示:

#include <sstream> // std::stringstream
#include <iostream> // std::cout

int main(int argc, const char * argv[]) {

    std::stringstream stream;
    std::string string;
    std::cout << "Max string size: " << string.max_size() << "\n";

    for (int i = 0; true; i++) {
        if (i >= 644245094) {
            stream.seekg(0, std::ios::end);
            std::stringstream::pos_type size = stream.tellg();
            stream.seekg(0, std::ios::beg);
            std::cout << "Size of stringstream: " << size << "\n";
        }
        stream << "hello";
    }

    return 0;
}
在此之后,程序崩溃

我认为原因可能是因为该程序填满了我的计算机的RAM,但该程序使用的内存约为6.01GB,因此不足以填满我的RAM。作为记录,我有一台16GB内存的MacBookPro


有什么问题吗?我是否遗漏了一些关于std::stringstream在满负荷和故障时的行为在所有平台上可能不一致的方面

我修改了您的代码,并将其放在Yocto 3.19.0-32 64位和gcc 5.4.1上。我没有得到抛出的异常,而是流设置了它的一个失败模式位

我运行的代码是:

#include <sstream>    // std::stringstream
#include <iostream>   // std::cout

std::stringstream::pos_type get_size(std::stringstream& stream)
{
    stream.seekg(0, std::ios::end);
    std::stringstream::pos_type size = stream.tellg();
    stream.seekg(0, std::ios::beg);
    return size;
}

int main(int argc, const char * argv[])
{
    std::stringstream stream;
    std::string string;
    std::cout << "Max string size: " << string.max_size() << std::endl;
    std::stringstream::pos_type size;

    for (unsigned long i = 0; true; ++i)
    {
        size = get_size(stream);
        stream.write("x", 1);
        if (stream.fail())
        {
            std::cout << "Fail after " << i + 1 << " insertions" << std::endl;
            std::cout << "Size of stringstream just before fail: " << size << std::endl;
            break;
        }
    }

    size = get_size(stream);
    std::cout << "Size of stringstream just after fail: " << size << std::endl;

    return 0;
}

你不能使用不同的容器并预先分配内存,而不是使用如此大的stringstream吗?

嗯,现在我的解决方法是,如果我的实例太大,直接将字符串打印到输出文件中,而不使用stringstream。我应该用什么样的容器来代替stringstream?@jackscorrow如果直接写入文件对你有用的话,也许就这样吧。或者,如果您事先知道最终的大小,可以从一个空的std::string开始,调用其reserve()成员函数来预分配内存,然后将数据附加到其中。这样,如果没有足够的内存,就会提前抛出一个错误的alloc。如果您只需要一个缓冲区,而不需要std::string提供的增值字符串处理函数,那么您可以对std::vector执行相同的操作。我必须修改很多行代码,我没有时间这么做。关于我的问题,我发现并不是我在代码中犯了错误,而是
stringstream
的工作原理。我看看将来是否能按照你的建议修改代码。我正在考虑回答的问题。
#include <sstream>    // std::stringstream
#include <iostream>   // std::cout

std::stringstream::pos_type get_size(std::stringstream& stream)
{
    stream.seekg(0, std::ios::end);
    std::stringstream::pos_type size = stream.tellg();
    stream.seekg(0, std::ios::beg);
    return size;
}

int main(int argc, const char * argv[])
{
    std::stringstream stream;
    std::string string;
    std::cout << "Max string size: " << string.max_size() << std::endl;
    std::stringstream::pos_type size;

    for (unsigned long i = 0; true; ++i)
    {
        size = get_size(stream);
        stream.write("x", 1);
        if (stream.fail())
        {
            std::cout << "Fail after " << i + 1 << " insertions" << std::endl;
            std::cout << "Size of stringstream just before fail: " << size << std::endl;
            break;
        }
    }

    size = get_size(stream);
    std::cout << "Size of stringstream just after fail: " << size << std::endl;

    return 0;
}
Max string size: 4611686018427387897
Fail after 8589934536 insertions
Size of stringstream just before fail: 8589934535
Size of stringstream just after fail: -1