Bra*_*nar 19 c++ this placement-new
最近出现在我作为助教的课堂上.我们正在教学生如何用c ++编写复制构造函数,最初教过java的学生问你是否可以从另一个构建函数调用.我知道这个问题的答案是否定的,因为他们在课堂上使用了迂腐的旗帜作为他们的代码,而旧标准对此并不支持.我在Stackoverflow和其他网站上发现了使用new (this)如下伪造此内容的建议
class MyClass
{
private:
int * storedValue;
public:
MyClass(int initialValue = 0)
{
storedValue = new int(initialValue);
}
~ MyClass()
{
delete storedValue;
}
MyClass(const MyClass &b)
{
new (this) MyClass(*(b.storedValue));
}
int value() {
return *storedValue;
}
};
Run Code Online (Sandbox Code Playgroud)
这是非常简单的代码,显然不会通过重用构造函数来保存任何代码,但它仅仅是例如.
我的问题是,这是否符合标准,如果有任何边缘情况应该考虑,以防止这是声音代码?
编辑:我应该注意到这对我来说似乎是非常危险的,但是从我不太了解它不仅仅是知道如何变坏它的观点来看更多.我只是想确保如果学生被问到我可以指导他们为什么能够或不应该这样做.为了所有实际目的,我已经向他们建议使用共享初始化方法.这更像是一个教学问题,而不是一个实际项目.
ton*_*ony 17
C++ 0x将引入语法以允许构造函数调用其他构造函数.
在那之前,new(this)在某些情况下有效,但不是全部.特别是,一旦在构造函数中,您的基类已经完全构造.重构通过new(this)重新调用基础构造函数而不调用基础析构函数,所以如果基类没有期待这种hackery,那么期待问题 - 而且它们可能不是.
清晰的一个例子:
class Base
{
public:
char *ptr;
MyFile file;
std::vector vect;
Base()
{
ptr = new char[1000];
file.open("some_file");
}
~Base()
{
delete [] ptr;
file.close();
}
};
class Derived : Base
{
Derived(Foo foo)
{
}
Derived(Bar bar)
{
printf(ptr...); // ptr in base is already valid
new (this) Derived(bar.foo); // ptr re-allocated, original not deleted
//Base.file opened twice, not closed
// vect is who-knows-what
// etc
}
}
Run Code Online (Sandbox Code Playgroud)
或者他们说'欢闹随之而来'
| 归档时间: |
|
| 查看次数: |
9021 次 |
| 最近记录: |