C++ EXC_坏访问使用<&书信电报;关于stringstream对象
我正在写一段代码,需要在内存中写入一个大字符串。 我使用了一个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[]) {
错误而崩溃
我创建了一个测试程序,如下所示:
#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