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