问题应该相当简单,但我不是C ++程序员。
因此想象一下,std::vector
在函数中填充了一些局部变量。我想要做的是返回指向该数据的指针并从该函数计数,但不是向量本身(因为它转到另一种语言,而不是C ++)。那么最好的方法是什么?
我打赌我可以使用new
关键字声明向量,但是当我稍后在其free()
上调用pointer data
时,是否会出现泄漏?
我也可以malloc()
新的缓冲区,将矢量缓冲区复制到其中并返回新缓冲区,但我希望我能避免这种情况。
答案 0 :(得分:1)
您可以使用std::vector<T>&
作为参数声明您的函数,并仅返回vector.count()
(请参阅Pass by reference in C++)。后者在客户端代码中将空构造向量传递给该函数。
要获取指向原始数据的指针,您可以使用&vector[0]
或&vector.front()
。从C ++ 11开始,vector
中有一个新添加的成员函数:data(),它返回容器中初始元素的地址。
通常,不要使用不必要的malloc/free
操作,并且在不需要时避免使用堆分配。考虑智能指针而不是原始指针和make_shared/make_unique
而不是显式new
。
答案 1 :(得分:0)
如果你的向量包含基本类型(例如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
答案 2 :(得分:0)
假设您需要声明一个具有以下定义的函数: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();
}
从多个线程调用时。静态变量是initialized properly但是push_back函数不是线程安全的。您还需要为每个线程使用不同的缓冲区,但这并不能保证总安全(考虑到您无法知道该数据的生命周期应该有多长)。 get_buffer
应为每个帖子返回唯一的std::vector
。您可以将static
更改为thread_local
来使用thread local storage(请参阅this):
std::vector<SomeType>& get_buffer()
{
thread_local std::vector<SomeType> data;
return data;
}
thread_local
以后的节点c++11
如果您使用的是c ++ 03,则需要使用boost库或特定于平台的代码。