Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
删除向量而不删除数组 我试图填充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 - Fatal编程技术网

删除向量而不删除数组 我试图填充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

    该库不提供任何内置功能来实现这一点。你得自己记账

  • 为数据分配内存并从向量复制数据
  • 将数据发送到FORTRAN
  • 决定何时可以安全地解除分配数据,然后将其删除

  • //在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

    该库不提供任何内置功能来实现这一点。你得自己记账

  • 为数据分配内存并从向量复制数据
  • 将数据发送到FORTRAN
  • 决定何时可以安全地解除分配数据,然后将其删除

  • //在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进行清理
    }
    //如果您想花时间找出一个健壮的复制构造函数,您可以。
    //就我个人而言,我怀疑我