【发布时间】:2017-04-06 05:51:51
【问题描述】:
我正在尝试在 C++ 中填充双精度向量并将关联的数组传递给 Fortran。但是我无法释放与向量相关的其余内存。我想避免复制。这是我所拥有的:
std::vector<double> *vec = new std::vector<double>();
(*vec).push_back(1.0);
(*vec).push_back(2.0);
*arr = (*vec).data(); //arr goes to Fortran
如何在保持arr 不变的同时删除vec?有没有办法使vec 中指向arr 的指针无效,以便我可以删除vec?
更新
我发现我在这里没有提供足够的信息。几件事:
- 我实际上是在 Fortran 中使用 iso_c_binding 调用 C++ 函数
- 我不知道
vec需要多大。向量类看起来很适合这种情况
我最终可能会尝试 Guillaume 的建议,但现在,我将 vec 传递给 Fortran,并在完成数据处理后调用另一个 C++ 函数将其删除
【问题讨论】:
-
std::vector不支持此功能。 -
在 c++ 中,访问指针成员的首选方法是
->运算符。vec->push_back(1.0);. -
堆分配的 STL 容器是一个很好的方法。它们不适合多态性,并且与值语义很相配。执行
new std::vector是一种解决 STL 的所有不便的方式,但没有任何优势。 -
为什么要用
new创建向量?这样做几乎没有任何充分的理由。 -
至于默认向量自己管理内存,您需要编写自己的分配器。将向量的内容复制到数组中要容易得多。