我可以通过参考来调用安置新闻和驱动器
Can I call placement-new and the destructor through references?
我可以将引用传递给非初始化的内存,拿起地址,然后调用new new或在获得的内存安置上调用击曲线。换句话说,是以下程序Legal 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[]
时再次销毁。
没有其他看起来不错的;我的意思是使用原始分配,这通常是不良实践,并且代码是例外不安全,等等。
dtor (memory [0]);
delete [] memory;
绝对是未定义的行为。
在行中构建的对象的寿命
std::string * memory = new std::string [10];
使用位置新操作员时结束。
因此,
delete [] memory;
是未定义的行为。
update
代码的更新行
dtor (memory [0]);
operator delete (reinterpret_cast<void *> (memory));
表现良好。
用位置分配的对象的攻击函数新操作员仅称为一次。
operator new
调用分配的内存通过operator delete
调用。
您的编辑后,似乎不再有未定义的行为。
但是,您的代码中仍然存在危险:
您的memory
变量具有指向A 构造字符串的指针的类型,即使在指针初始化后,该指针背后没有字符串。指针也不是nullptr
。那很危险。您向编译器断言某物是正确构造的对象,而不是。因此,您的编译器不会错误地使用未构造对象的行为。
我强烈建议使用char*
变量跟踪非初始化的内存,并且仅将类型的指针用于已经正确构造的对象。
相关文章:
- GetShortPathName在网络驱动器上使用中文文件夹时失败
- 在QTreeView中仅显示共享驱动器和文件夹
- roll_die没有在这个独家新闻中宣布
- QT MYSQL 驱动器构建,未定义对"mysql_get_client_version@0"的引用
- 通过搜索硬盘驱动器查找文件目录
- 如何确定SSD驱动器是固定驱动器还是连接在USB上
- 关于从驱动器中删除文件的问题
- 如何使用libusb获取驱动器名称?
- 如何确定文件或文件夹是在SSD还是硬盘驱动器上?
- 如何解决:自定义QGraphics项目接收鼠标新闻事件坐标延迟/滞后?
- Qt驱动器下拉列表仅列出USB记忆棒
- C++ gtkmm:文件选择器对话框不适用于任何驱动器
- 使用 MFC c++ 删除已装载驱动器的文件
- 阻止访问映射的网络驱动器
- 驱动器号上的查找文件失败,但在路径上传递
- 将硬盘驱动器上的 BIT XXX 从 0 更改为 1
- 更改 ICDBurn 窗口 API 中的默认刻录驱动器
- C 操作员超载调用驱动器
- 在字符串驱动器中读取访问违规
- 我可以通过参考来调用安置新闻和驱动器