gpt4 book ai didi

c++ - 无限扩展双端队列而不是 vector 时崩溃

转载 作者:太空宇宙 更新时间:2023-11-04 16:13:00 24 4
gpt4 key购买 nike

运行这段代码时:

#include <iostream>
#include <vector>
#include <deque>

template< typename C >
void fillToMax( C & collection, typename C::value_type value )
{
try
{
while( true )
collection.push_back( value );

}
catch( std::bad_alloc const& )
{
std::cout << "bad alloc with size " << collection.size() << std::endl;
}
return;
}

void fillVector()
{
std::vector<long> vecL;
fillToMax( vecL, 123 );
}

void fillDeque()
{
std::deque<long> deqL;
fillToMax( deqL, 123 );
}

int main()
{
fillVector();
fillDeque();
}

我收到预期的 bad_alloc 错误,因此很容易尝试/捕获。问题是当我用 deque 替换 vector 时,在这种情况下我的机器就崩溃了......黑屏,重新启动并且再次启动时声称:你遇到了意外问题!

我想使用 deque 而不是 vector 来存储大量的项目,而不会出现连续空间的问题。这将使我能够存储更多数据,但我不能承受我的应用程序崩溃的后果,我想知道如何将其转移到 bad_alloc。

这可能吗?

我的测试在 win8.1 上使用 MinGW-W64 - gcc 版本 4.8.2 (x86_64-posix-seh-rev4)

最佳答案

你没有说你使用的是什么系统,所以很难说,但是一些系统“过度使用”,这基本上使符合不可能实现 C++(甚至 C);系统会说有可用内存而没有可用内存,然后崩溃当您尝试使用它时。 Linux 是记录最广泛的罪魁祸首,但您可以重新配置它以使其正常工作。

你用 vector 得到 bad_alloc 的原因是因为 vector分配更大的 block 。即使过度使用,如果 block 太大,系统将拒绝分配内存。此外,许多 mallocs 将使用不同的分配策略非常大的 block ; IIRC,Linux 中的 malloc 切换到使用mmap 超过一定大小,系统可能会拒绝 mmap即使 sbrk 会成功。

关于c++ - 无限扩展双端队列而不是 vector 时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26164107/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com