Утечка памяти в C ++ - Что мне удалить и где? - PullRequest
2 голосов
/ 13 мая 2011

Утечка памяти существует в следующей функции.Проблема в том, что я знаю, как, когда, где и что удалять.Вот код:

#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;
}

Как видите, я пытался удалить новый массив, который я выделил после того, как использовал его.Это действительно имеет смысл, что это не сработало, но я не уверен, что делать здесь ..

Добавлено delete[] pArray:

#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] << ", ";
    }

    delete[] pArray;

    std::cout << std::endl;

    while(true){ }

    return 0;
}

Это решает любой, если вообщеутечки памяти в этой ситуации?

Ответы [ 5 ]

6 голосов
/ 13 мая 2011

Вы выделяете и удаляете массив в функции.И вы также возвращаете его.

int main()
{

// Этот размещен в стеке, поэтому он будет удален при выходе из main ()

    double dbls[] = { 1, 2, 3, 4, 5 };

    double* pArray = dbls;

    //...

// Ваша функция выделяетна некоторую память теперь указывает 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){ }

// Вы забыли удалить память, выделенную вашей функцией !!!Утечка памяти !!!

    return 0;
}
1 голос
/ 13 мая 2011

Вы хотели сделать это:

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

}

Я не понимаю, зачем выделять новый массив, если вы хотите изменить переданный массив.

1 голос
/ 13 мая 2011

Здесь:

*ppDoubleArray = pNewDoubleArray;
delete[] pNewDoubleArray;

Вы удаляете массив, который вы только что передали вызывающей стороне.Не делай этого, удаляй!Вызывающий должен управлять памятью после ее передачи обратно.

Вместо того, чтобы перепрыгивать через все эти циклы, вам следует подумать о написании "реального" кода C ++ с использованием контейнерных объектов, таких как std::vector, которые будут управлятьпамять для вас.

0 голосов
/ 13 мая 2011

Вы не можете delete pNewDoubleArray, так как вы сохраняете его адрес в ppDoubleArray.Вам необходимо delete[] pArray, когда он больше не используется, или перед установкой его на другой адрес (при повторном вызове someFunc(&pArray, ...)).

0 голосов
/ 13 мая 2011

В someFunc вы выделяете массив, а затем устанавливаете указатель, переданный пользователем, для указания на него.При выходе из функции вы удаляете этот массив, и в итоге пользователь получает указатель на освобожденную память.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...