gpt4 book ai didi

具有给定内存的c++ vector 构造

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:17:24 30 4
gpt4 key购买 nike

我想使用 std::vector 来控制给定的内存。首先,我很确定这不是好的做法,但好奇心占了上风,无论如何我都想知道如何做到这一点。

我遇到的问题是这样的方法:

vector<float> getRow(unsigned long rowIndex)
{
float* row = _m->getRow(rowIndex); // row is now a piece of memory (of a known size) that I control
vector<float> returnValue(row, row+_m->cols()); // construct a new vec from this data
delete [] row; // delete the original memory
return returnValue; // return the new vector
}

_m 是一个 DLL 接口(interface)类,它返回一个 float 数组,这是调用者负责删除的。所以我想将它包装在一个 vector 中并将其返回给用户......但是这个实现为 vector 分配新内存,复制它,然后删除返回的内存,然后返回 vector 。

我想做的是直接告诉新 vector 它可以完全控制这 block 内存,所以当它被删除时,内存就会被清理干净。

更新:这个问题的最初动机(从 DLL 返回的内存)已经被一些响应者相当坚定地压扁了 :) 但是,我很想知道这个问题的答案...有没有一种方法可以使用给定的预分配内存 T* 数组 block 以及该内存的大小来构造 std::vector?

最佳答案

显而易见的答案是使用自定义分配器,但您可能会发现这确实是满足您需要的重量级解决方案。如果您想这样做,最简单的方法是采用实现定义的分配器(作为 vector<> 的默认 scond 模板参数),复制它并使其按要求工作。

另一种解决方案可能是定义 vector 的模板特化,根据实际需要定义尽可能多的接口(interface)并实现内存定制。

最后,如何使用符合标准的 STL 接口(interface)定义您自己的容器,定义随机访问迭代器等。这可能很容易,因为底层数组将很好地映射到 vector<>,指向它的指针将映射到迭代器。

评论 UPDATE:“有没有一种方法可以使用给定的预分配内存块 T* 数组以及该内存的大小来构造 std::vector?”

当然,这里的简单答案是“否”。如果您希望结果是 vector<>,那么它必须支持按需增长,例如通过 reserve() 方法,而这对于给定的固定分配是不可能的。所以真正的问题是:你到底想达到什么目的?可以像 vector<> 这样使用的东西,或者在某种意义上确实必须 一个 vector 的东西,如果是这样,那是什么意思?

关于具有给定内存的c++ vector 构造,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4847217/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com