获取 STL 向量指针的所有权是否安全?

埃博拉*_*博拉酱 -1 c++ stl vector

我想使用向量来收集一些生成的整数,直到运行时我才知道其中的数量。但是,我必须实现的接口需要返回一个本机指针,该指针应该由调用者释放。该向量将非常大,因此,为了避免复制,我执行以下操作:

std::vector<int>* const Collector = new std::vector<int>;
//Several Collector.push_back();s
int* ReturnPointer = Collector->data();
free(Collector);
return ReturnPointer;
Run Code Online (Sandbox Code Playgroud)

上面的代码旨在避免向量的解构,这将释放我必须返回的数据指针 - 并且向量控制器本身也被释放。

我的问题是:这个技巧安全吗?或者有更好的解决方案吗?

重要提示:完整的架构不在我的控制范围内。我不允许返回本机指针以外的其他内容,也不允许调用者更改其调用代码。也就是说,我无法返回该向量。

我知道释放新指针是不好的。那么该怎么办:

std::vector<int>* const Collector = (std::vector<int>*)malloc(sizeof(std::vector<int>*));
*Collector = std::vector<int>;
//Several Collector.push_back();s
int* ReturnPointer = Collector->data();
free(Collector);
return ReturnPointer;
Run Code Online (Sandbox Code Playgroud)

这次我释放了malloced指针,这样可以吗?

Cal*_*eth 5

可以,但不能用std::vector<int>. 您需要一个与释放兼容的分配器,并且不会释放最终的数组。

如果你newnew[]或者malloc必须分别deletedelete[]free,混合这些是未定义的行为。您必须检查接口如何释放返回值。

您也不需要new本地向量。

template <typename T>
class releasing_allocator {
    bool * released;
public:
    using value_type = T;

    releasing_allocator(bool * released) : released(released) {}

    T * allocate(std::size_t n) { return new T[n]; }
    void deallocate(T * p, std::size_t n) { if (!*released) delete[] p; }    
};

bool done = false;
std::vector<int, releasing_allocator<int>> Collector{ releasing_allocator { &done } };
Collector.push_back(42); // etc
done = true;
return Collector.data();
Run Code Online (Sandbox Code Playgroud)

由于这些问题,通常要求调用者分配他们将取消分配的任何内容。