返回指向矢量数据的指针,而不会复制缓冲区和内存泄漏

时间:2017-05-10 12:27:07

标签: c++ pointers vector memory-leaks

问题应该相当简单,但我不是C ++程序员。

因此想象一下,std::vector在函数中填充了一些局部变量。我想要做的是返回指向该数据的指针并从该函数计数,但不是向量本身(因为它转到另一种语言,而不是C ++)。那么最好的方法是什么?

我打赌我可以使用new关键字声明向量,但是当我稍后在其free()上调用pointer data时,是否会出现泄漏?

我也可以malloc()新的缓冲区,将矢量缓冲区复制到其中并返回新缓冲区,但我希望我能避免这种情况。

3 个答案:

答案 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)

有一件事需要考虑;它是从多个调用的 线程与否:

  1. 当您只有一个线程调用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();
    }
    
  2. 从多个线程调用时。静态变量是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库或特定于平台的代码。