删除向量而不删除数组 我试图填充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 std::vector*vec=new std::vector(); (*vec)。向后推(1.0); (*vec)。向后推(2.0); *arr=(*vec.data()//arr转到Fortran
如何在保持删除向量而不删除数组 我试图填充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 std::vector*vec=new std::vector(); (*vec)。向后推(1.0); (*vec)。向后推(2.0); *arr=(*vec.data()//arr转到Fortran,c++,pointers,stdvector,C++,Pointers,Stdvector,如何在保持arr完整的同时删除vec?有没有办法将vec中指向arr的指针置零,这样我就可以删除vec 更新 我发现我在这里没有提供足够的信息。有几件事: 我实际上是在使用Fortran调用C++函数的ISO+ CXBILL/< 我不知道vec需要多大。vector类适合这种情况 我可能会尝试纪尧姆的建议,但是现在,我把代码> VEC 传递给FORTRAN,并调用另一个C++函数,一旦我完成了数据 ,就删除它。vector是一个性能良好的模板类,当它被销毁时,它将释放它所拥有和管理的内部构件 在
arr
完整的同时删除vec
?有没有办法将vec
中指向arr
的指针置零,这样我就可以删除vec
更新
我发现我在这里没有提供足够的信息。有几件事:
我实际上是在使用Fortran调用C++函数的ISO+ CXBILL/<
vec
需要多大。vector类适合这种情况<>我可能会尝试纪尧姆的建议,但是现在,我把代码> VEC <代码>传递给FORTRAN,并调用另一个C++函数,一旦我完成了数据 ,就删除它。vector是一个性能良好的模板类,当它被销毁时,它将释放它所拥有和管理的内部构件 在使用向量的内容时,您必须使其保持活动状态,这非常有意义。否则,你将不得不复印一份
另外,我不明白为什么要在堆上分配向量,它似乎根本不需要。您所要求的是不可能的。vector是一个性能良好的模板类,当它被销毁时,它将释放它所拥有和管理的内部构件 在使用向量的内容时,您必须使其保持活动状态,这非常有意义。否则,你将不得不复印一份 另外,我不明白为什么要在堆上分配向量,它似乎根本不需要 如何在保持arr完整的同时删除vec?有没有办法将vec中指向arr的指针置零,这样我就可以删除vec 该库不提供任何内置功能来实现这一点。你得自己记账
//在vec中填充数据
std::vec;
向量推回(1.0);
向量推回(2.0);
//为arr分配内存并从vec复制数据
double*arr=新的double[vec.size()];
复制(vec.begin(),vec.end(),arr);
//使用arr
//删除arr
删除[]arr;
如何在保持arr完整的同时删除vec?有没有办法将vec中指向arr的指针置零,这样我就可以删除vec
该库不提供任何内置功能来实现这一点。你得自己记账
//在vec中填充数据
std::vec;
向量推回(1.0);
向量推回(2.0);
//为arr分配内存并从vec复制数据
double*arr=新的double[vec.size()];
复制(vec.begin(),vec.end(),arr);
//使用arr
//删除arr
删除[]arr;
如何在保持arr完整的同时删除vec?有没有办法将vec中指向arr的指针置零,这样我就可以删除vec
你没有
我认为你误用或误解了vector的用途。它不是要公开底层数组的内存管理,而是要将动态大小的数组表示为常规类型 如果您需要显式管理内存,我建议您使用
std::unique\u ptr
。由于unique pointers提供了一种管理内存并在不删除内存的情况下释放其资源的方法,因此我认为它是满足您需求的一个很好的候选者
auto arr = std::make_unique<double[]>(2);
arr[0] = 1.;
arr[1] = 2.;
auto data = arr.release();
// You have to manage `data` memory manually,
// since the unique pointer released it's resource.
// arr is null here
// data is a pointer to an array, must be deleted manually later.
delete[] data;
auto-arr=std::使_唯一(2);
arr[0]=1。;
arr[1]=2。;
自动数据=arr.release();
//您必须手动管理“数据”内存,
//由于唯一指针释放了它的资源。
//这里arr为空
//数据是指向数组的指针,以后必须手动删除。
删除[]数据;
如何在保持arr完整的同时删除vec?有没有办法将vec中指向arr的指针置零,这样我就可以删除vec
你没有
我认为你误用或误解了vector的用途。它不是要公开底层数组的内存管理,而是要将动态大小的数组表示为常规类型 如果您需要显式管理内存,我建议您使用
std::unique\u ptr
。由于unique pointers提供了一种管理内存并在不删除内存的情况下释放其资源的方法,因此我认为它是满足您需求的一个很好的候选者
auto arr = std::make_unique<double[]>(2);
arr[0] = 1.;
arr[1] = 2.;
auto data = arr.release();
// You have to manage `data` memory manually,
// since the unique pointer released it's resource.
// arr is null here
// data is a pointer to an array, must be deleted manually later.
delete[] data;
auto-arr=std::使_唯一(2);
arr[0]=1。;
arr[1]=2。;
自动数据=arr.release();
//您必须手动管理“数据”内存,
//由于唯一指针释放了它的资源。
//这里arr为空
//数据是指向数组的指针,以后必须手动删除。
删除[]数据;
您需要重新思考您的程序设计
不知何故,在某个地方,当Fortran使用数组时,您需要让它保持活动状态。所以,无论您使用什么上下文来访问Fortran,都应该对此数组的所有权负责
class fortran_context {
/*Blah blah blah whatever API you're using to access Fortran*/
void * arr;
std::vector<double> vec; //Don't allocate this as a pointer; makes no sense!
public:
fortran_context() {
arr = //Do whatever is necessary to setup Fortran stuff. I'm assuming your
//api has some kind of "get_array_pointer" function that you'll use.
}
~fortran_context() {
//Do the cleanup for the fortran stuff
}
//If you want to spend time figuring out a robust copy constructor, you may.
//Personally, I suspect it's better to just delete it, and make this object non-copyable.
fortran_context(fortran_context const&) = delete;
std::vector<double> & get_vector() {
return vec;
}
std::vector<double> const& get_vector() const {
return vec;
}
void assign_vector_to_array() {
*arr = vec.data();
}
void do_stuff_with_fortran() {
assign_vector_to_array();
//???
}
};
int main() {
fortran_context context;
auto & vec = context.get_vector();
vec.push_back(1.0);
vec.push_back(2.0);
context.do_stuff_with_fortran();
return 0;
} //Cleanup happens automatically due to correct implementation of ~fortran_context()
class fortran\u上下文{
/*随便你用什么API来访问Fortran*/
无效*arr;
std::vector vec;//不要将其分配为指针;没有意义!
公众:
fortran_上下文(){
arr=//做任何必要的事情来安装Fortran的东西。我假设
//api有一些您将要使用的“获取数组指针”函数。
}
~fortran_context(){
//对fortran进行清理
}
//如果您想花时间找出一个健壮的复制构造函数,您可以。
//就我个人而言,我怀疑我