编译不带delete操作符的c++
Compiling C++ without the delete operator
我正在为嵌入式设备编写一个c++程序,我想在编译时不使用libstdc++、异常和动态内存分配。
示例程序:
#include <stdio.h>
class A
{
public:
virtual ~A() {}
virtual void Foo() = 0;
};
class B : public A
{
public:
virtual ~B() {}
virtual void Foo() override{}
};
int main()
{
B b;
return 0;
}
我立即遇到了以下错误:
$ GCC src.cpp -static -fno-rtti -fno-exceptions -std=c++11
/tmp/ccd0Wydq。0:在函数
A::~A()': src.cpp:(.text._ZN1AD2Ev[_ZN1AD5Ev]+0x29): undefined reference to
operator delete(void*)'/tmp/ccd0Wydq. 00:在函数A::~A()': src.cpp:(.text._ZN1AD0Ev[_ZN1AD5Ev]+0x20): undefined reference to
中operator delete(void*)'/tmp/ccd0Wydq。0:在函数B::~B()': src.cpp:(.text._ZN1BD2Ev[_ZN1BD5Ev]+0x35): undefined reference to
operator delete(void*)'/tmp/ccd0Wydq。0:在函数B::~B()': src.cpp:(.text._ZN1BD0Ev[_ZN1BD5Ev]+0x20): undefined reference to
中operator delete(void*)/tmp/ccd0Wydq.o:(.rodata._ZTV1A[_ZTV1A]+0x20): undefined reference to' __cxa_pure_virtual' collect2: error: ld返回1退出状态make: *** [all] Error 1
我明白为什么需要__cxa_pure_virtual
,但我一辈子都不明白为什么我需要delete
的实现。
我在代码中没有执行new
或delete
操作,为什么需要它?
当实现这两个函数以满足链接器的需求时,似乎两者都没有被调用(如预期的那样)。
有没有办法避免实现这些函数?
当通过delete
表达式调用虚析构函数时,被调用的operator delete
是从派生最多的类的作用域确定的。例如,
#include <iostream>
class Base {
public:
virtual ~Base() {}
};
void destroy_base(Base* b) { delete b; }
class Derived : public Base {
public:
static void operator delete(void* ptr) {
std::cout << "Derived::operator deleten";
::operator delete(ptr);
}
};
int main() {
destroy_base( new Derived );
}
打印"Derived::operator delete"
,即使函数destroy_base
不知道类Derived
。
c++通过在每个类的虚函数表中放置两个版本的析构函数来实现这一点:一个只销毁成员和基类,另一个完成所有这些,然后调用相应的operator delete
。这就是你的未定义符号的来源。
如果你从来没有真正使用过delete
表达式,只要去掉::operator delete
函数就可以了。
- 为什么map有操作符[],set没有
- 我可以将C 17 Capture lambda ConstexPR转换操作符的结果用作函数指针模板非类型参数吗?
- c++新操作符通过libstdc++占用大量内存(67MB)
- 复制/移动操作符是否可以安全地用于实现复制/移动分配操作符
- 提升::精神::因果报应使用有条件的替代操作符(|)
- 促进几何体操作符
- 如果操作符delete没有实现,为什么不编译它
- 在使用放置新操作符时,我真的需要担心对齐问题吗
- 我怎样才能让getline操作符工作
- 在重载的全局new操作符中使用静态对象会导致核心转储运行时错误
- 提升ipc new和delete操作符
- 在c++中使用new操作符动态分配数组
- 操作符的大小在C++
- 如何将向量中的对象传递给操作符
- 一个更容易的拷贝分配操作符实现
- 如何重写复杂的c++代码行(嵌套的三元操作符)
- boost::make_shared没有调用(放置)操作符new
- 新操作符(以及malloc)无法分配~450MB的内存
- 类、异常和操作符
- 当delete操作符释放内存时,我为什么需要析构函数