Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.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++ C++;内存泄漏-我应该删除什么,在哪里删除?_C++_Pointers_Memory Management_Memory Leaks - Fatal编程技术网

C++ C++;内存泄漏-我应该删除什么,在哪里删除?

C++ C++;内存泄漏-我应该删除什么,在哪里删除?,c++,pointers,memory-management,memory-leaks,C++,Pointers,Memory Management,Memory Leaks,以下功能中存在内存泄漏。我遇到的麻烦是知道如何、何时、何地以及删除什么。代码如下: #include "stdafx.h" #include <iostream> void someFunc(double** ppDoubleArray, int length) { double* pNewDoubleArray = new double[length]; for(int i = 0; i < length; i++) { pNewD

以下功能中存在内存泄漏。我遇到的麻烦是知道如何、何时、何地以及删除什么。代码如下:

#include "stdafx.h"
#include <iostream>

void someFunc(double** ppDoubleArray, int length)
{
    double* pNewDoubleArray = new double[length];

    for(int i = 0; i < length; i++)
    {
        pNewDoubleArray[i] = 3 * i + 2;
    }

    *ppDoubleArray = pNewDoubleArray;
}
int main()
{
    double dbls[] = { 1, 2, 3, 4, 5 };
    double* pArray = dbls;

    int length = sizeof dbls / sizeof dbls[0];

    std::cout << "Before..." << std::endl;

    for(int i = 0; i < length; i++)
    {
        std::cout << pArray[i] << ", ";
    }

    std::cout << std::endl;

    someFunc(&pArray, length);

    std::cout << "After..." << std::endl;

    //Expected series is: 2, 5, 8, 11, 14

    for(int i = 0; i < length; i++)
    {
        std::cout << pArray[i] << ", ";
    }

    std::cout << std::endl;

    while(true){ }

    return 0;
}

如果在这种情况下出现内存泄漏,这是否解决了任何问题?

您正在函数中分配和删除一个数组。你也要把它还给我

int main()
{
//这一个是在堆栈上分配的,因此在退出main()时它将被删除

//您的函数将分配一些pArray现在指向的内存

    someFunc(&pArray, length);

    std::cout << "After..." << std::endl;

    //Expected series is: 2, 5, 8, 11, 14

    for(int i = 0; i < length; i++)
    {
        std::cout << pArray[i] << ", ";
    }

    std::cout << std::endl;

    while(true){ }

someFunc
中分配数组,然后将用户传递的指针设置为指向该数组。退出函数后,您将删除该数组,用户将得到一个指向已释放内存的指针。

此处:

*ppDoubleArray = pNewDoubleArray;
delete[] pNewDoubleArray;
删除刚刚传递回调用方的数组。不要这样做删除!传回内存后,由调用方管理内存


< >不要跳过所有这些环,你应该考虑使用“代码”> STD::vector < /代码>来编写“真实”的C++代码,它将管理你的内存。

< P>你不能<代码>删除< /COD> <代码> pNeNeXiLeLe> <代码>,因为你的地址存储在代码> ppDouDurix。当不再使用[]pArray时,或者在将其设置到另一个地址之前(再次调用
someFunc(&pArray…)
),您必须
删除[]pArray

您的意思是:

void someFunc(double** ppDoubleArray, int length)
{
     for(int i = 0; i < length; i++)
    {
        *ppDoubleArray[i] = 3 * i + 2;
    }

}
void someFunc(double**ppDoubleArray,int-length)
{
for(int i=0;i

我不明白,如果您想修改传入的数组,为什么要分配一个新数组。

使用
std::vector
。保持理智。世界末日的饥饿。我来自C#背景,所以使用托管内存绝对是很棒的。我确实是这样做的,以确保我理解C++中内存管理的细节。这不是C++内存管理,而是C内存管理。C++通过存储容器中的内存来处理内存,而内存可能是内存中的东西。通常情况下,你可能不会这样做,但是我认为这样做会带来一个有趣的问题。
    return 0;
}
*ppDoubleArray = pNewDoubleArray;
delete[] pNewDoubleArray;
void someFunc(double** ppDoubleArray, int length)
{
     for(int i = 0; i < length; i++)
    {
        *ppDoubleArray[i] = 3 * i + 2;
    }

}