【问题标题】:C++ Constructor without new [duplicate]没有新的C ++构造函数[重复]
【发布时间】:2020-07-04 18:54:30
【问题描述】:

我正在尝试在嵌入式应用程序中使用 c++。我遇到了一个理论问题

鉴于我没有动态分配,我不使用“新”运算符。问题是关于为对象和析构函数调用构造函数。

我想把我的对象放在内存中的 x 地址。我这样声明:

Foo *myClass = (Foo *) 0x1; //for example
//I guess i need to call constructor manually ?
myClass->myClass();

那么调用构造函数然后手动调用它的解决方案是什么。我应该自己做一个新的操作员吗?例如

void * operator new(size_t size, uint32_t address)
{
  return (void *)(address); 
}

编译器使用 arm-none-eabi-g++,目标 armv7-m

【问题讨论】:

标签: c++ embedded


【解决方案1】:

假设地址0x1的内存已分配,可以使用placement new

Foo *myClass = new(0x1) Foo;

要破坏你的对象,你可以手动调用析构函数:

myClass->~Foo();

【讨论】:

  • delete myClass 不会调用析构函数?
  • 如果没有new(不算placement new,不分配任何东西),应该没有delete。无论内存是如何分配的,都应该使用相应的工具将其释放。我猜您实际上不需要分配(或取消分配)内存。
  • 是的,不需要分配它,因为它将被放置在那里并初始化。并且不需要析构函数,只是好奇
  • @AntonStafeyev ,我认为最好保留析构函数。如果将来您的班级创建/持有资源,则该资源将被自动释放。 (当然前提是你手动编写类的析构函数!!)
  • @AbdusKhazi 不确定你的意思。如果您正在编写现代 C++,您可能不需要编写自己的析构函数。不过,您需要手动调用它,除非您不在乎,而只是退出程序或其他东西。
猜你喜欢
  • 2015-07-24
  • 1970-01-01
  • 2020-05-19
  • 1970-01-01
  • 2011-07-15
  • 2020-09-22
  • 2013-07-23
  • 1970-01-01
  • 2021-09-02
相关资源
最近更新 更多