编译不带delete操作符的c++

Compiling C++ without the delete operator

本文关键字:c++ 操作符 delete 编译      更新时间:2023-10-16

我正在为嵌入式设备编写一个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的实现。

我在代码中没有执行newdelete操作,为什么需要它?

当实现这两个函数以满足链接器的需求时,似乎两者都没有被调用(如预期的那样)。

有没有办法避免实现这些函数?

当通过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函数就可以了。