在没有delete运算符的情况下编译C++

Gil*_*man 10 c++ linker 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;
}
Run Code Online (Sandbox Code Playgroud)

我立刻遇到了以下错误.

$ gcc src.cpp -static -fno-rtti -fno-exceptions -std = c ++ 11

/tmp/ccd0Wydq.o:在函数A::~A()': src.cpp:(.text._ZN1AD2Ev[_ZN1AD5Ev]+0x29): undefined reference to 运算符中删除(void*)'/ tmp/A::~A()': src.cpp:(.text._ZN1AD0Ev[_ZN1AD5Ev]+0x20): undefined reference to ccd0Wydq.o:在函数B::~B()': src.cpp:(.text._ZN1BD2Ev[_ZN1BD5Ev]+0x35): undefined reference to 运算符中删除(void*)'/ tmp/ccd0Wydq.o:在函数运算符中删除(void*)'/ tmp /ccd0Wydq.o:在函数B::~B()': src.cpp:(.text._ZN1BD0Ev[_ZN1BD5Ev]+0x20): undefined reference to 运算符delete(void*)'/ tmp/ccd0Wydq.o :(.rodata._ZTV1A [_ZTV1A] + 0x20):未定义引用`__cxa_pure_virtual'colle2:错误:ld返回1退出状态Makefile: 2:目标'all'失败的配方make:***[all]错误1

我明白为什么__cxa_pure_virtual需要,但不能为我的生活得到我需要delete实现的原因.

我在代码中执行no newdeleteoperation,为什么需要它?

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

有没有办法避免实现这些功能?

asc*_*ler 12

当通过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 delete\n";
        ::operator delete(ptr);
    }
};

int main() {
    destroy_base( new Derived );
}
Run Code Online (Sandbox Code Playgroud)

打印"Derived::operator delete",即使函数destroy_base没有类的知识Derived.

g ++通过在每个类的vtable中放置两个版本的析构函数来实现这一点:一个只是破坏成员和基础,一个完成所有这些,然后调用适当的operator delete.这是未定义符号的来源.

如果你从未真正使用过delete表达式,只需将::operator delete函数存根,你应该没问题.