【问题标题】:How do I set up a function that returns a pointer to a vector in C++?如何在 C++ 中设置一个返回指向向量的指针的函数?
【发布时间】:2011-08-14 02:52:37
【问题描述】:

我需要帮助找出一些代码。我需要一个函数来加载带有给定字符串的向量并返回一个指针。我打算用它来生成多个向量,然后用指针来显示它们。

我不知道如何设置函数返回指针和稍后显示向量。请仅对包含 //HELP NEEDED HERE

的行提出建议
#include <iostream>
#include <string>
#include <vector>

using namespace std;

int pointerReturner (string str1, string str2) //HELP NEEDED HERE
{
    vector<string> vList;
    vList.push_back(str1); 
    vList.push_back(str2); 
    return vList; //HELP NEEDED HERE
}

int main(int argc, char* argv[]) {

    vector<string> vMakeList1;
    vMakeList1 =pointerReturner("Honda","Toyota");//HELP NEEDED HERE
    for (vector<string>::iterator n=vMakeList1.begin(); n!=vMakeList1.end();++n)
    {
        cout<<*n<<endl;
    }

    vector<string> vMakeList2;
    vMakeList2=pointerReturner("Chrysler","Ford");//HELP NEEDED HERE
    for (vector<string>::iterator n=vMakeList2.begin(); n!=vMakeList2.end();++n)
    {
        cout<<*n<<endl;
    }

    cin.get();
    return 0;
}

【问题讨论】:

    标签: function visual-c++ pointers


    【解决方案1】:

    您必须使用 new 运算符动态分配向量。否则,向量只是一个自动变量,在函数 pointerReturner 结束后被销毁。您还必须将此函数的返回类型从 int 更改为指向向量 (vector*) 的指针。 但是如果你动态分配一个对象,你必须使用 delete 操作符显式地销毁它,否则分配的内存将永远不会被释放,这将导致内存泄漏。

    #include <iostream>
    #include <string>
    #include <vector>
    
    using namespace std;
    
    vector<string>* pointerReturner (string str1, string str2)
    {
        vector<string> *vList = new vector<string>();
        vList->push_back(str1); 
        vList->push_back(str2); 
        return vList;
    }
    
    int main(int argc, char* argv[]) {
    
        vector<string> *vMakeList1;
        vMakeList1 = pointerReturner("Honda","Toyota");
        for (vector<string>::iterator n=vMakeList1->begin(); n!=vMakeList1->end();++n)
        {
            cout<<*n<<endl;
        }
        delete vMakeList1;
    
        vector<string> *vMakeList2;
        vMakeList2=pointerReturner("Chrysler","Ford");
        for (vector<string>::iterator n=vMakeList2->begin(); n!=vMakeList2->end();++n)
        {
            cout<<*n<<endl;
        }
        delete vMakeList2;
    
        cin.get();
        return 0;
    }
    

    【讨论】:

    • 另请参阅我的编辑,一旦不再需要分配的向量,您必须记住删除它。
    • 您能否编辑,将 替换为 并将 替换为 ,以供后代使用?
    • 当然 :) 现在应该可以编译了
    • 删除分配的向量有关系吗?
    • 您可以随时删除它,但是删除后就不能再使用了(如果您尝试分段错误肯定会发生)。当你删除一个对象时,你会取回它使用的内存。如果您不删除该对象并且指向它的指针丢失(例如当您用其他值覆盖它时),那么在程序完成之前,该内存将永远不会被回收。对于这两个简单的向量,它似乎并不多,但这是始终记住删除对象的规则,否则您的程序的内存使用量将无限增长,直到它崩溃。
    猜你喜欢
    • 1970-01-01
    • 2011-01-12
    • 2010-11-03
    • 2020-04-29
    • 2013-04-10
    • 2010-10-13
    • 2020-10-13
    • 1970-01-01
    相关资源
    最近更新 更多