使用std :: unique_ptr

时间:2016-12-10 13:30:03

标签: c++

我尝试使用unique_ptr来查看内存管理在c ++中是如何工作的。

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回答声明我需要使用(新丁),我在试图找到泄漏时狠狠地删除了那部分。将它添加到问题中,因为它不能解决内存泄漏问题,但会调用构造函数和解析器来进行调用。

2 个答案:

答案 0 :(得分:10)

漏洞来自std :: vector。放入嵌套范围应解决问题:

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

答案 1 :(得分:5)

代码不会创建任何Ding个对象,这就是永远不会调用构造函数的原因。 std::unique_ptr<Ding> toAdd;创建一个包含空指针的unique_ptr对象;它没有创建Ding对象。要创建一个,请使用operator new

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