stringstream坑(重用时值未更新)

本文针对在循环中重复使用stringstream对象导致内存占用持续增加的问题进行了分析,并提供了解决方案。通过在每次使用后调用strStream.str()来清空缓存区,可以有效避免内存泄漏,保持内存占用稳定。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

同这位博主遇到的问题类似,博主也给出了以下分析:
https://blog.youkuaiyun.com/l631068264/article/details/25115917

在for循环中每次调用strStream.clear()是希望在每次使用完strStream之后清理strStream占用的资源,但stringstream的clear方法并没有真正地释放strStream占用的空间,这样strStream所占用的空间一直在增长。当size较大时,strStream消耗的内存迅速增长,可能出现严重问题。

解决方法

在多次转换中,使用同一个stringstream对象,需要使用其对象方法str来重置stringstream的buffer,这样能确保stringstream占用的内存不会越积越多。

举例

#include<iostream>
#include<string>
#include<sstream>
using namespace std;
int main(){
      stringstream ss;
      string str;
      ss<<1;
      ss>>str;
      ss<<2;
      ss>>str;
      cout<<str<<endl;
      system("pause");
}

其输出值是1,而不是2。

应该添加:strStream.str("");//清空缓冲区。

#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/select.h> #include <sys/socket.h> #include <arpa/inet.h> #include <string.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #define PORT 8080 #define MAX_CLIENTS 3 int main() { int server_fd, new_sock, max_sd, activity; struct sockaddr_in address; fd_set readfds;// char buffer[1024]; /*1.SOCKET*/ server_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (server_fd== 0) { perror("Socket failed"); return 0; } address.sin_family = AF_INET; address.sin_addr.s_addr = inet_aton("10.55.101.13",&address.sin_addr); address.sin_port = htons(PORT); // 绑定套接字 if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) { perror("Bind failed"); return 0; } // 监听连接 if (listen(server_fd, MAX_CLIENTS) < 0) { perror("Listen failed"); exit(EXIT_FAILURE); } printf("Listening on port %d\n", PORT); // 设置文件描述符集合 FD_ZERO(&readfds); FD_SET(server_fd, &readfds); max_sd = server_fd; while (1) { // 调用 select 等待事件 activity = select(max_sd + 1, &readfds, NULL, NULL, NULL); if (activity < 0) { perror("Select error"); exit(EXIT_FAILURE); } // 检查是否有新的连接请求 if (FD_ISSET(server_fd, &readfds)) { struct sockaddr_in client_address; socklen_t addr_len = sizeof(client_address); new_sock = accept(server_fd, (struct sockaddr *)&client_address, &addr_len); if (new_sock < 0) { perror("Accept failed"); exit(EXIT_FAILURE); } printf("New connection established\n"); FD_SET(new_sock, &readfds); // 添加新连接的套接字 if (new_sock > max_sd) { max_sd = new_sock; } } // 检查每个连接是否可读 for (int i = 0; i <= max_sd; i+
03-14
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值