相关疑难解决方法(0)

"放置新"有什么用途?

有没有人曾经使用过C++的"贴牌新品"?如果是这样,那该怎么办?在我看来,它只对内存映射硬件有用.

c++ memory-management placement-new new-operator

385
推荐指数
18
解决办法
16万
查看次数

使用new(this)重用构造函数

最近出现在我作为助教的课堂上.我们正在教学生如何用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)

这是非常简单的代码,显然不会通过重用构造函数来保存任何代码,但它仅仅是例如.

我的问题是,这是否符合标准,如果有任何边缘情况应该考虑,以防止这是声音代码?

编辑:我应该注意到这对我来说似乎是非常危险的,但是从我不太了解它不仅仅是知道如何变坏它的观点来看更多.我只是想确保如果学生被问到我可以指导他们为什么能够或不应该这样做.为了所有实际目的,我已经向他们建议使用共享初始化方法.这更像是一个教学问题,而不是一个实际项目.

c++ this placement-new

19
推荐指数
3
解决办法
9021
查看次数

我可以在operator =中使用placement new(this)吗?

背景: 我有一个复杂的类,有很多变量.我有一个声音和测试的复制构造函数:

Applepie::Applepie( const Applepie &copy) :
m_crust(copy.m_crust),
m_filling(copy.m_filling)
{
}
Run Code Online (Sandbox Code Playgroud)

在初始化列表中调用的一些成员变量复制构造函数执行分配.

问题: 我需要创建operator=.我可以简单地执行以下操作,而不是使用赋值而不是初始化列表复制现有的构造函数,释放正在被替换的内存等等,

Applepie& Applepie::operator=( const Applepie &copy)
{
    if( this != &copy)
    {
       this->~Applepie(); // release own object
       new(this) Applepie(copy); // placement new copy constructor
    }
    return *this;
}
Run Code Online (Sandbox Code Playgroud)

换句话说,是毁灭自我后跟一个放置新的复制构造函数在语义上与operator =?

这似乎有可能大大减少重复代码并确认每个变量都已正确初始化,但代价是在分配期间可能会略微降低效率.我错过了一些更加模糊的东西吗?

理由: 我的实际班级有大约30个变量.我担心我的复制构造函数和我的赋值操作符都必须复制所有三十个,并且代码可能会发散,导致两个操作以不同的方式执行操作.

c++ operator-overloading placement-new

9
推荐指数
1
解决办法
2165
查看次数