1

我有如下功能

int* readFile(string InputPath)
{
    int *myvar = new int[10]; //The file has 10 lines (Using heap)

    ifstream inFile;

    inFile.open(InputPath.c_str(), ios::in);

    if (inFile.fail())
    {
        cout << "Error reading the input file ";
        cout << InputPath << ".";
        exit(0);
    }
    string fileLine;

    while (getline(inFile, fileLine))
    {
       myvar[i]=toint(fileLine); //will be converted to int!
    }
    ;
    inFile.close();



    return myvar;
}:

如何释放堆(myvar)?一般来说,返回此类数组的最佳方法是什么?

4

5 回答 5

2

如何释放堆(myvar)?

您返回的 int* ;不要改变它,不要丢失它,当你用完记忆,

delete [] theReturnedPointer;

除非您有充分的理由将其设为数组,否则您可以省去内存管理的麻烦,而只需使用向量即可。

最好的方法

最好的方法是返回一个向量:

vector<int> readFile(const string& InputPath)
{
    ifstream inFile(InputPath); // or inputPath.c_str() for old compilers
    if (!inFile)
    {
        cout << "Error reading the input file " << InputPath << ".";
        exit(0); // thow would be better! Or at least return an empty vector.
    }

    vector<int> myvar;
    for(int n; inFile >> n && myvar.size() < 10; )
    {
       myvar.push_back(n);
    }
    return myvar;
}

但是如果你真的很想使用new[],那么至少返回自管理指针,std::unique_ptr<int[]>。永远不要让原始指针转义函数,而不是在 C++ 中。

于 2012-09-19T07:33:34.283 回答
2

显然,调用它成为调用者的责任delete[]。请注意,这意味着调用者必须知道返回的指针是用 分配的new[],这并不是最佳的。

您应该返回 a std::vector<int>,这使得这一切变得更加简单。

于 2012-09-19T07:33:47.523 回答
2

调用者必须delete[]是函数返回的值。目前的代码没有为超出数组末尾的写入提供任何保护:

while (getline(inFile, fileLine))
{
    myvar[i]=toint(fileLine); //will be converted to int!
}

但是,由于这是 C++,因此请使用 a并直接从输入流中std::vector<int>读取ints,而不是将它们作为字符串读取并执行转换。std::vector<int>将为您处理内存管理:

std::vector<int> myvar;

int i;
while (inFile >> i) myvar.push_back(i);

std::vector<int>从函数返回。调用者可以确切地知道返回值中有多少int个 s(如果您返回一个数组,除非您包含一个标记值来指示结束,否则它不能知道)并且不需要显式删除它。

于 2012-09-19T07:34:21.740 回答
1

必须有一些代码会在这个指针上调用 delete。

我认为,更好的方法是获取一个指针作为参数。这样做会迫使使用此函数的人初始化数组,所以他会知道,他将来必须删除它。

于 2012-09-19T07:35:49.267 回答
0

C++ 中的约定是不返回分配的内存。相反,函数原型应该看起来像

size_t readFile(string InputPath,int* array,size_t n_elements);

该函数返回它实际放置在数组中的元素数。调用者将使用适当的方法分配和释放内存,而不是必要的 new/delete[] 而是 malloc/free 或更低级别的系统函数,例如 VirtualAlloc。

于 2012-09-19T07:40:55.610 回答