C++ 返回指针后删除堆

C++ 返回指针后删除堆,c++,C++,我有一个如下的函数 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

我有一个如下的函数

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? 一般来说,返回此类数组的最佳方法是什么?

如何释放堆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。永远不要让原始指针逃逸一个函数,而不是C++。p> 如何释放堆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。永远不要让原始指针逃逸一个函数,而不是C++。p> 调用delete[]显然是调用方的责任。请注意,这意味着调用者必须知道返回的指针是用new[]分配的,这并不完全是最优的


您应该返回一个std::vector,这使它变得更加简单。

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

您应该返回一个std::vector,这使它变得更加简单。

调用者必须删除[]函数返回的值。目前的代码对数组末尾以外的写操作不提供任何保护:

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

但是,因为这是C++,所以使用A替代,直接从输入流读取int,而不是将它们作为字符串读取,并执行转换。vector将为您处理内存管理:

std::vector<int> myvar;

int i;
while (inFile >> i) myvar.push_back(i);
从函数返回std::vector。调用者可以准确地知道返回值中有多少个整数,如果返回数组,则调用者无法知道这些整数,除非包含一个指示结束的哨兵值,并且不需要显式删除它。

调用者必须删除[]从函数返回的值。目前的代码对数组末尾以外的写操作不提供任何保护:

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

但是,因为这是C++,所以使用A替代,直接从输入流读取int,而不是将它们作为字符串读取,并执行转换。vector将为您处理内存管理:

std::vector<int> myvar;

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

从函数返回std::vector。调用者可以准确地知道返回值中有多少个整数,如果返回数组,调用者将无法知道这些整数,除非您包含一个指示结束的哨兵值,并且不需要显式删除它。

必须有一些代码将在此指针上调用delete

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

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

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

< P> C++中的约定是不返回分配的内存。相反,函数原型应该如下所示

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

函数返回实际放置在数组中的元素数。调用方将使用适当的方法分配和释放内存,而不是NeaseCeCuff[Dele][],但也可以使用MalOC/自由或低级系统函数,如ValualLoC.

< P> C++中的约定是不返回分配的内存。相反,函数原型应该如下所示

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

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

最佳方法-使用std::vector。您将责任传递给函数的调用者。最好返回一个管理所有权的智能指针,或者使用一个容器。@Boperson:我同意,但我认为这是他最不关心的问题,因为如果给定的文件无法打开,他会执行exit0操作。:-]std::unique_ptr可能就是您在这里寻找的。最佳方法-使用std::vector。您正在将职责传递给函数的调用方。最好返回一个管理所有权的智能指针,或者使用一个容器。@Boperson:我同意,但我认为这是他最不关心的问题,因为如果给定的文件无法打开,他会执行exit0操作。:-]标准:统一 que_ptr可能是你在这里寻找的。我认为你的for循环很有创意,我必须读两遍才能理解发生了什么。我认为你的for循环很有创意,我必须读两遍才能理解发生了什么。