2016-12-10 2 views
-1

Im try out unique_ptr, чтобы увидеть, как управление памятью работает в C++.Memoryleak при использовании std :: unique_ptr

Ding.h

#pragma once 
class Ding 
{ 
public: 
    int value; 
    Ding(); 
    ~Ding(); 
}; 

Ding.cpp

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

Ding::Ding() 
{ 
    value = 90000; 
    std::cout << "Constructor for ding called."; 
} 


Ding::~Ding() 
{ 
    std::cout << "Destructor for ding called."; 
} 

main.cpp

#include "stdafx.h" 
#include <memory> 
#include "Ding.h" 

#define _CRTDBG_MAP_ALLOC 
#include <stdlib.h> 
#include <crtdbg.h> 

int main() 
{ 
    std::cout << "starting." << std::endl; 
    std::vector<std::unique_ptr<Ding>> dingen; 
    for (int i = 0; i < 10; i++) 
    { 
     std::unique_ptr<Ding> toAdd(new Ding); 
     dingen.push_back(std::move(toAdd)); 
    } 
    std::cout << "ending" <<std::endl; 

    _CrtDumpMemoryLeaks(); 
    return 0; 
} 

Когда я запускаю этот код я могу увидеть ошибки памяти в выходном зрения отладки :

Detected memory leaks! 

Dumping objects -> {151} normal block at 

0x00000155B0798140, 104 bytes long. Data: <    > 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 {144} normal block at 
0x00000155B07A2300, 16 bytes long. Data: < S    > 08 FB 53 
D3 14 00 00 00 00 00 00 00 00 00 00 00 Object dump complete. 

Что создает эти утечки?

изменить: как ответ dasblinkenlight заявил, что мне нужно использовать (новый Ding), я аккуратно удалил эту часть, пытаясь найти утечку. Добавил его к вопросу, поскольку он не решает проблему утечки памяти, но вызывает конструктор и деструктор для ding.

+1

Вы не получаете никакого результата от конструктора или деструктора, потому что вы на самом деле не создаете * никаких объектов. –

+3

Ну, для начала вы никогда не создаете никаких объектов Ding. (Что заставило вас думать, что вы это сделали?) Но в вашем коде нет утечек, так что это странно. –

+0

Интересно, почему он обнаруживает утечки памяти. Наверное, потому что все еще в стеке? Если вы завершаете все, кроме _CrtDumpMemoryLeaks() в фигурных скобках, проблема может быть решена. –

ответ

10

Утечка происходит из станд :: вектор. Ввод в вложенный объем должен исправить проблему:

int main() { 
    { // Open new scope 
     std::cout << "starting." << std::endl; 
     std::vector<std::unique_ptr<Ding>> dingen; 
     for (int i = 0; i < 10; i++) 
     { 
      std::unique_ptr<Ding> toAdd; 
      dingen.push_back(std::move(toAdd)); 
     } 
     std::cout << "ending" <<std::endl; 
    } // Close the scope 

    _CrtDumpMemoryLeaks(); 

    return 0; 
} 
5

Код не создает никаких объектов Ding, поэтому конструктор никогда не вызывается. std::unique_ptr<Ding> toAdd; создает объект unique_ptr, который содержит нулевой указатель; он не создает объект Ding. Для создания используйте operator new:

std::unique_ptr<Ding> toAdd(new Ding); 
+0

К сожалению, я немного изменил свой код, когда искал утечку, что создает утечку, хотя? Я соответствующим образом обновил свой вопрос. –

Смежные вопросы