首页
社区
课程
招聘
[讨论] 好像发现了一个 c++ 的 bug,但是不确定
发表于: 1天前 464

[讨论] 好像发现了一个 c++ 的 bug,但是不确定

1天前
464

我编写了一个程序需要处理大内存,使用了 std::stringstream 写临时缓存,我在循环中不断往 std::stringstream 写入数据,结果它到了 2g 大小之后,大小就不变了,好像截断了一样,还是说它内部使用了 int32 的长度变量?

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
int main(int argc, char *argv[]) {
 
    std::cout << "int 大小: " << sizeof(int) << std::endl;
    std::cout << "size_t 大小: " << sizeof(size_t) << std::endl;
    std::cout << "void * 大小: " << sizeof(void *) << std::endl;
 
    // 1 MB 临时数据
    const size_t t_size = 1024 * 1024;
    char *t_data = new char[t_size];
 
    std::stringstream body;
 
    // 写入 1 GB
    for (size_t i = 0; i < 1024; i++) {
        body.write(t_data, t_size);
    }
    std::cout << "文件大小 1: " << body.str().size() << std::endl;
 
    // 再写入 1 GB, 到达临界
    for (size_t i = 0; i < 1024; i++) {
        body.write(t_data, t_size);
    }
    std::cout << "文件大小 2: " << body.str().size() << std::endl;
 
    // 再写入 1 MB, 大小不再改变
    body.write(t_data, t_size);
    std::cout << "文件大小 3: " << body.str().size() << std::endl;
 
    delete[] t_data;
    return 0;
}

输出结果:

1
2
3
4
5
6
int 大小: 4
size_t 大小: 8
void * 大小: 8
文件大小 1: 1073741824
文件大小 2: 2147483647
文件大小 3: 2147483647

[注意]APP应用上架合规检测服务,协助应用顺利上架!

收藏
免费 1
支持
分享
最新回复 (4)
雪    币: 877
活跃值: (4061)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
在 std::stringstream 内部,它使用的是 std::string 来存储数据。std::string 的最大大小通常受到平台上可用内存和实现的限制。对于一些 32 位系统来说,确实可能会因为内部使用 32 位整数来表示字符串长度而导致最大大小为 2GB 左右。

在现代的 64 位系统上,这个限制通常不再是问题,因为 std::string 的实现会使用 64 位整数来表示长度。不过,具体情况还是依赖于你的编译器和标准库实现。

如果你遇到了 std::stringstream 无法增长超过 2GB 的问题,以下是一些可能的解决方案:

检查编译器和标准库的实现:确保你的编译器和标准库是支持 64 位的。

使用不同的数据结构:考虑使用 std::vector<char> 或其他可以手动控制大小的数据结构来代替 std::stringstream。

分片处理:将数据分成多个小于 2GB 的片段进行处理,避免单个 std::stringstream 过大。

希望这些信息能帮到你!如果你有其他问题或需要进一步的帮助,请随时告诉我。

14小时前
0
雪    币: 14676
活跃值: (17774)
能力值: ( LV12,RANK:290 )
在线值:
发帖
回帖
粉丝
3
感觉现在ChatGPT可以解决大部分问题
13小时前
0
雪    币: 877
活跃值: (4061)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
应该是内存分配失败了,你用malloc分配2GB的内存也会失败的
13小时前
0
雪    币: 877
活跃值: (4061)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
       // 检查流状态
       if (body) {
               std::cout << "写入成功!" << std::endl;
       }
       else {
               std::cerr << "写入失败!" << std::endl;
       }
11小时前
0
游客
登录 | 注册 方可回帖
返回
//