埋め込みデバイス用のC++プログラムを作成しています。libstdC++、例外、および動的メモリ割り当てなしでコンパイルしたいと考えています。削除演算子を使用せずにC++をコンパイルする
プログラム例:
#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.o: In function
A::~A()': src.cpp:(.text._ZN1AD2Ev[_ZN1AD5Ev]+0x29): undefined reference to
operator delete(void*)' /tmp/ccd0Wydq.o: In functionA::~A()': src.cpp:(.text._ZN1AD0Ev[_ZN1AD5Ev]+0x20): undefined reference to
operator delete(void*)' /tmp/ccd0Wydq.o: In functionB::~B()': src.cpp:(.text._ZN1BD2Ev[_ZN1BD5Ev]+0x35): undefined reference to
operator delete(void*)' /tmp/ccd0Wydq.o: In functionB::~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 returned 1 exit status Makefile:2: recipe for target 'all' failed make: *** [all] Error 1
私は__cxa_pure_virtual
が必要な理由を理解するが、私はdelete
実装を必要とする理由は私の人生のために得ることができませんでした。
コード内でnew
またはdelete
操作を実行しない理由は何ですか?
リンカの要求を満たすために両方の関数を実装すると、どちらも呼び出されていないように見えます(期待どおり)。
これらの機能を実装する方法はありますか?
何もしないことで実装するのに問題がありますか? –
私はそれらが呼び出されていないことを確かめるために大きなassert(1 == 0)でそれらをスタブします。 –
これは醜い解決策です。それが唯一の解決策であれば、私はそれをしますが、なぜそれが事実であるかを知りたいのです。 –