【发布时间】:2012-06-01 15:49:35
【问题描述】:
我有这样的课
class variable
{
public:
variable(int _type=0) : type(_type), value(NULL), on_pop(NULL)
{
}
virtual ~variable()
{
if (type)
{
std::cout << "Variable Deleted" <<std::endl;
on_pop(*this);
value=NULL;
}
}
int type;
void* value;
typedef void(*func1)(variable&);
func1 on_pop;
}
然后我将实例推送到 std::vector 中,如下所示:
stack.push_back(variable(0));
我希望变量的析构函数会被调用,但是 if 直到一个值被分配给 type 才会进入,因为我希望我提供的构造函数会在实例被复制到向量中时被调用。但由于某种原因,它不是。
调用 stack.push_back 后,析构函数(副本的?)运行,并且类型有一些随机值,就像从未调用过构造函数一样。
我似乎无法弄清楚我做错了什么。请帮忙! ^_^
编辑:
好的,这是一个独立的例子来说明我的意思:
#include <iostream>
#include <vector>
class variable
{
public:
variable(int _type=0) : type(_type), value(NULL), on_pop(NULL)
{
}
~variable()
{
if (type)
{
std::cout << "Variable Deleted" <<std::endl;
on_pop(*this);
value=NULL;
}
}
int type;
void* value;
typedef void(*func1)(variable&);
func1 on_pop;
};
static void pop_int(variable& var)
{
delete (int*)var.value;
}
static void push_int(variable& var)
{
var.type = 1;
var.value = new int;
var.on_pop = &pop_int;
}
typedef void(*func1)(variable&);
func1 push = &push_int;
int main()
{
std::vector<variable> stack;
stack.push_back(variable(0));
push(stack[stack.size()-1]);
stack.push_back(variable(0));
push(stack[stack.size()-1]);
stack.push_back(variable(0));
push(stack[stack.size()-1]);
return 0;
}
上面的程序输出如下:
Variable Deleted
Variable Deleted
Variable Deleted
Variable Deleted
Variable Deleted
Variable Deleted
Process returned 0 (0x0) execution time : 0.602 s
Press any key to continue.
【问题讨论】:
-
不清楚实际发生了什么,以及您期望发生什么:即使允许编译器在这里优化,它会正确初始化所有对象,所以这段代码可以正常工作正如我所期望的那样。显然,您的期望不同,但我不明白它们是什么,或者为什么。
-
@KonradRudolph 我添加了一个 SSCCE 来展示我正在尝试做的事情。如果析构函数被调用 6 次,我希望构造函数被调用相同的次数。