gpt4 book ai didi

c++ - 我可以通过引用调用 placement-new 和析构函数吗?

转载 作者:搜寻专家 更新时间:2023-10-31 02:08:02 24 4
gpt4 key购买 nike

我能否传递对未初始化内存的引用,获取地址,然后调用 placement-new 或在获得的内存位置上调用析构函数。换句话说,下面的程序是合法的 C++ 还是它有未定义的行为:

#include <string>
#include <iostream>

void ctor (std::string &s)
{
new (&s) std::string ("Hello, world!");
}

void dtor (std::string &s)
{
(&s)->std::string::~string ();
}

int main ()
{
std::string * memory = static_cast<std::string *> (
operator new (sizeof (std::string) * 10));

ctor (memory [0]);

std::cout << memory [0] << '\n';

dtor (memory [0]);

operator delete (memory);
}

当然可以,而且我尝试了 gcc 的未定义行为清理器,它没有产生任何错误。但是任何人都可以根据标准确认/反驳。

最佳答案

上面的代码在 [0] 双重构造一个字符串,这是一个潜在的资源泄漏,双重破坏它,这是未定义的行为。

new string[10] 构造数组中的对象。 delete[] 销毁对象。您在另一个对象之上创建一个新对象,然后销毁它,然后在您delete[] 时再次销毁它。

其他看起来没有问题;我的意思是它使用原始分配,这通常是不好的做法,并且代码是异常不安全的,等等。

关于c++ - 我可以通过引用调用 placement-new 和析构函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47971664/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com