ROS交流群
ROS Group 产品服务
Product Service 开源代码库
Github 官网
Official website 技术交流
Technological exchanges 激光雷达
LIDAR ROS教程
ROS Tourials 深度学习
Deep Learning 机器视觉
Computer Vision
ROS Group 产品服务
Product Service 开源代码库
Github 官网
Official website 技术交流
Technological exchanges 激光雷达
LIDAR ROS教程
ROS Tourials 深度学习
Deep Learning 机器视觉
Computer Vision
C++在使用C库时malloc和new导致的错误
-
在用C++编程的时候对于Linux的系统相关操作,比如socket的处理。经常要调用系统的程序库。Linux系统的库主要用c编写。一般情况下C++使用起来并没有什么问题。但是也有一些需要注意的地方。
在使用C的库时开辟内存要用malloc,一般C++程序用new。比如下面就是我遇到的一个例子
#ifdef WIN32 send(sockfd, request.c_str(), request.size(), 0); #else write(sockfd, request.c_str(), request.size()); #endif char *buf = (char *)malloc(1024 * 1024); int offset = 0; int rc; #ifdef WIN32 while ((rc = recv(sockfd, buf + offset, 1024, 0))) #else while ((rc = read(sockfd, buf + offset, 1024))) #endif { offset += rc; } #ifdef WIN32 closesocket(sockfd); #else close(sockfd); #endif buf[offset] = 0; std::string res = std::string(buf); auto find_res = res.find("\r\n\r\n"); auto body = res.substr(res.find("\r\n\r\n") + 4, res.size()); free(buf);
这里的buf如果用
char *buf = new char[1024 * 1024]
定义buf,然后用delete[] buf
去释放内存。编译时并不会有问题,但是在Linux上运行时会出segment fault错误。在Windows上运行是正常的。
用上面的方式定义buf和回收buf就没有问题。