【发布时间】:2019-10-18 17:54:24
【问题描述】:
我最近看到我的一个同事使用std::string 作为缓冲区:
std::string receive_data(const Receiver& receiver) {
std::string buff;
int size = receiver.size();
if (size > 0) {
buff.resize(size);
const char* dst_ptr = buff.data();
const char* src_ptr = receiver.data();
memcpy((char*) dst_ptr, src_ptr, size);
}
return buff;
}
我猜这个人想利用返回字符串的自动销毁,所以他不必担心释放分配的缓冲区。
这对我来说有点奇怪,因为根据cplusplus.com data() 方法返回一个const char* 指向一个由字符串内部管理的缓冲区:
const char* data() const noexcept;
Memcpy-ing 到一个 const char 指针? AFAIK 只要我们知道自己在做什么,这并没有什么坏处,但是我错过了什么吗?这很危险吗?
【问题讨论】:
-
使用 C++17
data()有一个重载,返回一个指向非 const 限定字符的指针。 -
...cppreference 提到的。 cplusplus.com 不是最好的来源。
-
我认为从
const char*到char*的转换操作本身就意味着您的程序中存在某种危险。如果dst_ptr指向一个只读内存块,那么您不应该尝试使用该指针写入该块。 -
每当您看到使用 C 风格转换的代码(例如
(char*) dst_ptr)时,您都应该将其视为危险信号。 -
我认为这个问题主要是基于意见的。如果您知道您正在接收文本数据,IMO 使用
std::string作为缓冲区就可以了。如果您正在接收二进制数据,std::vector<char>可能是更好的选择。