2016-10-06 2 views
0

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

Мы можем вернуть этот динамический указатель, а затем освободить его. Я нашел способ отслеживать эту память. Это хорошая вещь:

#include <iostream> 

int foo() 
{ 
    int* pInt = new int(77); 
    int x = (int)pInt; 
    std::cout << std::hex << x << std::endl; // 3831d8 
    return x; 
} 


int main() 
{ 

    int* pLostMem = (int*)foo(); 

    std::cout << pLostMem << std::endl; // 003831D8 
    std::cout << std::dec << *pLostMem << std::endl; // 77 

    if(pLostMem) 
    { 
     delete pLostMem; 
     pLostMem = NULL; 
    } 

    std::cout << std::endl; 
    return 0; 
} 
+0

Что конкретно ваш вопрос? – Carcigenicate

+0

Нет никакого способа в стандартном C++ отслеживать распределения памяти, кроме как фактически отслеживать их самостоятельно. Если вы выделите нужную вам память позже, то *** верните указатель *** в эту память. Не возвращайте 'int', который, возможно, не сможет удерживать указатель. –

+2

Вот что [умные указатели] (http://en.cppreference.com/w/cpp/memory) из стандартной библиотеки C++. –

ответ

0

Это не совсем ясно, в вашем вопросе, но если вы просто хотите добавить cout заявления в свой код, чтобы показать значение указателя, вы можете сделать это без приведения к int. Указатели могут быть напечатаны только штрафом:

#include <iostream> 

int *foo() 
{ 
    int* pInt = new int(77); 
    std::cout << pInt << std::endl; // pointers can be output just fine 
    return pInt; 
} 

int main() 
{ 
    int* pLostMem = foo(); 

    std::cout << pLostMem << std::endl; // e.g. 0x16c2010 
    std::cout << *pLostMem << std::endl; // 77 

    delete pLostMem; 
    pLostMem = NULL; 

    std::cout << std::endl; 
    return 0; 
} 

Live example here.

Вы также don't need на if (pLostMem==NULL) проверку перед удалением.

+0

'if (pLostMem)' избыточно. –

+0

@George где конкретно ?? –

+0

@ πάνταῥεῖ да действительно, удалит. – mindriot