【发布时间】:2014-07-11 07:13:24
【问题描述】:
我阅读了一些关于 C++ 中指针的内容,并且不应该将所有内容都创建为指针。为了进一步了解这一点并了解它是如何工作的,我编写了一个小程序:
一个main.cpp
#include <iostream>
#include "Master.h"
using namespace std;
int main()
{
Master master = Master("master");
master.printSlaves();
return 0;
}
一个Master.h
class Master
{
public:
Master(std::string name);
~Master();
void printSlaves()
{
_slave1.printName();
_slave2->printName();
}
private:
Slave _slave1;
Slave *_slave2;
std::string _name;
};
还有一个Master.cpp
#include "Master.h"
Master::Master(std::string name)
{
std::cout << "Master() entered." << std::endl;
_name = name;
_slave2 = new Slave("slave2");
_slave1 = Slave("slave1");
std::cout << "\t" << _name << " created." << std::endl;
std::cout << "Master() exited." << std::endl;
}
Master::~Master()
{
std::cout << "\t" << _name << " destroyed." << std::endl;
}
和Slave.h
class Slave
{
public:
Slave()
{
}
Slave(std::string name);
void printName()
{
std::cout << "my name is " << _name << std::endl;
}
~Slave();
private:
std::string _name;
};
和Slave.cpp
#include "Slave.h"
Slave::Slave(std::string name)
{
std::cout << "Slave() entered." << std::endl;
_name = name;
std::cout << "\t" << _name << " created." << std::endl;
std::cout << "Slave() exited." << std::endl;
}
Slave::~Slave()
{
std::cout << "\t" << _name << " destroyed." << std::endl;
}
我期望的输出:
Master() entered.
Slave() entered.
slave2 created.
Slave() exited.
Slave() entered.
slave1 created.
Slave() exited.
master created.
Master() exited.
my name is slave1
my name is slave2
master destroyed.
slave1 destroyed.
但我得到了
Master() entered.
Slave() entered.
slave2 created.
Slave() exited.
Slave() entered.
slave1 created.
Slave() exited.
**slave1 destroyed.**
master created.
Master() exited.
my name is slave1
my name is slave2
master destroyed.
**slave1 destroyed.**
显然我的slave1 被销毁了两次。我不明白为什么会这样,为什么这甚至是可能的。
谁能给我解释一下?
【问题讨论】:
-
只是说,这是一个很好的问题,有一个很好的例子。
-
因为奴隶制是非法的。
-
实际上它比它需要的要冗长得多。
-
@LightnessRacesinOrbit,你是在谈论我的代码还是我的问题?代码有点膨胀。那是因为我很懒
-
@user2699453:是的,这就是问题所在。请不要偷懒。
标签: c++ pointers destructor