返回指向矢量数据的指针,而不复制缓冲区和内存泄漏
Return pointer to vector's data without copying buffer and memory leaks
这个问题应该很简单,但我不是一个C++程序员。
因此,假设我有一个std::vector
,其中填充了一些东西作为函数中的局部变量。我想做的是从该函数返回指向该数据和计数的指针,而不是向量本身(因为它转到另一种语言,而不是C++)。那么最好的方法是什么呢?
我敢打赌我可以用new
关键字声明向量,但是当我稍后在其pointer data
上调用free()
时,会不会有泄漏?
我也可以malloc()
新的缓冲区,将 vector 的缓冲区复制到其中并返回新的缓冲区,但我希望我能避免这种情况。
您可以使用std::vector<T>&
声明函数作为参数并仅返回vector.count()
(请参阅 C++ 中的通过引用传递)。后者,在客户端代码中将一个空的构造向量传递给该函数。
若要获取指向原始数据的指针,可以使用&vector[0]
或&vector.front()
。从 C++11 开始,vector
中新增了一个成员函数:data(),它返回容器中初始元素的地址。
通常,不要使用不必要的malloc/free
操作,并避免在不必要的情况下使用堆分配。考虑使用智能指针而不是原始指针,考虑使用make_shared/make_unique
而不是显式new
。
如果你的向量包含基本类型(例如int),并且你知道内存将被释放,你可以只使用:
if(v.empty()) return NULL;
int* retResut;
retResut= reinterpret_cast<int*>(std::malloc(v.size() * sizeof(int)));
std::memcpy(retResut,v.data(),v.size()* sizeof(int));
return retResut
假设您需要声明一个具有以下定义的函数:SomeType* foo();
.可以使用std::vector::data
获取指向数据的原始指针 (c++11)。在 c++03 的情况下,您可以使用&my_vector[0]
(并且您必须检查空向量以避免运行时调试 aserts)
有一件事需要考虑;它是从多个调用的吗 线程与否:
-
当您只有一个线程调用
foo
时:std::vector<SomeType>& get_buffer() { static std::vector<SomeType> data; return data; } SomeType* foo() { std::vector<SomeType>& buffer = get_buffer(); buffer.clear(); //fill buffer with stuff with push_back return buffer.data(); }
-
从多个线程调用时。静态变量已正确初始化,但push_back函数不是线程安全的。您还需要为每个线程使用不同的缓冲区,但这并不能保证完全安全(考虑到您无法知道该数据的生存期应该有多长)。
get_buffer
应为每个线程返回唯一的std::vector
。您可以通过将static
更改为thread_local
来使用线程本地存储(请参阅此处):std::vector<SomeType>& get_buffer() { thread_local std::vector<SomeType> data; return data; }
thread_local
节点是自c++11
如果您使用的是 c++03,则需要使用 boost 库或特定于平台的代码。
- 将缓冲区复制到剪贴板 [换行错误]
- 如何避免将数据缓冲区的额外副本复制到字符串?
- 适用于大型数组的无复制线程安全环形缓冲区
- Vulkan:设备在缓冲区复制过程中丢失
- 如何正确复制内存缓冲区?
- 如何将 QString 复制到缓冲区wchar_t
- 多线程和共享资源:使用C++定期将数据从缓冲区(数据结构)复制到文件
- strcpy_s将超过字符串长度的字符串复制到目标缓冲区(用 0xFE 填充)
- 返回指向矢量数据的指针,而不复制缓冲区和内存泄漏
- 来自 2 个指针的组合缓冲区,无需复制
- 无需额外复制即可存储和访问 deque<vectors> 缓冲区 (c++)?
- 包装二进制缓冲区 - 可能没有多余的移动/复制?
- 将包含位字段和动态数据的结构复制到 Char 数组缓冲区中
- 如果strncpy将随机数据复制到缓冲区中会发生什么
- 从缓冲区创建Qimage,没有深层复制
- 复制颜色和depthstencil缓冲区以备日后使用
- 如何在 Poco C++ 中复制缓冲区字节块
- DX11 OpenGL 互操作:无法复制缓冲区
- 构造不复制缓冲区的流
- 使用std::copy复制缓冲区