4

boost :: signalを使用してコールバックメカニズムを実装しようとしていますが、ライブラリの最も些細な使用法でも、boost::signalコードでメモリアクセスアサーションを取得しています。私はそれをこのコードに単純化しました:

#include <boost/signal.hpp>

typedef boost::signal<void (void)> Event;

int main(int argc, char* argv[])
{

    Event e;

    return 0;
}

ありがとう!

編集:これは、Visual Studio 2008 w/SP1でコンパイルされたBoost1.36.0でした。Boost :: filenameと同様に、Boost :: filesystemにも、リンクする必要のあるライブラリがあり、正常に機能しているようです。私が使用している他のすべてのBoostライブラリは、ヘッダーのみであると私は信じています。

4

4 に答える 4

6

私はこれが問題であることを確認しました - Microsoft の Stephan T Lavavej (STL!) がこれについてブログを書いています。

具体的には、次のように述べています。

一般的な問題は、リンカーがすべての One Definition Rule (ODR) 違反を診断しないことです。不可能ではありませんが、これは解決するのが難しい問題です。そのため、標準では、特定の ODR 違反を未診断のままにすることが明確に許可されています。

ビルド時にすべての ODR 違反をキャッチする特別なモードをコンパイラとリンカに持たせたいと思っていますが、それを達成するのは難しいことを認識しています (そして、おそらくもっと有効に利用できるリソースを消費します。より多くの適合)。いずれにせよ、ODR 違反は、コードを適切に構成することにより、極端な努力をしなくても回避できるため、私たちプログラマーはリンカー チェックの欠如に対処できます。

ただし、オンとオフを切り替えることによってコードの機能を変更するマクロは、ODR と危険なほどいちゃつきます。具体的な問題は、_SECURE_SCL と _HAS_ITERATOR_DEBUGGING の両方がまさにこれを行うことです。ビルド システムでプロジェクト全体でどのマクロを定義するかを既に制御している必要があるため、一見すると、これはそれほど悪くないように思えるかもしれません。ただし、個別にコンパイルされたライブラリは複雑になります。(たとえば) デフォルトである _SECURE_SCL をオンにして Boost をビルドした場合、プロジェクトで _SECURE_SCL をオフにしてはなりません。プロジェクトで _SECURE_SCL を無効にする場合は、それに応じて Boost を再構築する必要があります。また、問題の個別にコンパイルされたライブラリによっては、それが難しい場合があります (Boost を使用すると、私の理解によると、それを行うことができますが、方法がわかりませんでした)。

彼は後でコメントでいくつかの可能な回避策をリストしていますが、この状況に適切なものはありませんでした. 他の誰かが、 boost/config/compiler/visualc.hppにいくつかの定義を挿入することで、boost をコンパイルするときにこれらのフラグをオフにできると報告しましたが、これは私にとってはうまくいきませんでした。ただし、次の行VERBATIMtools/build/v2/user-config.jamに挿入するとうまくいきました。ジャムを促進するには空白が重要であることに注意してください。

msvc を使用: 9.0 : : <cxxflags>-D _SECURE_SCL=0 <cxxflags>-D _HAS_ITERATOR_DEBUGGING=0 ;
于 2008-09-29T17:01:09.533 に答える
2

この種の問題は、異なるヒープ実装でコンパイルするときによく発生します。VS では、CRT を (静的ライブラリとして) リンクするか、動的ライブラリとして残すように要求することができます。

使用するライブラリがリンクされたヒープにメモリを割り当て、プログラムが別のヒープを使用してメモリの割り当てを解除しようとすると、問題が発生します。解放されるオブジェクトは、割り当てられたオブジェクトのリストにありません。

于 2008-09-26T09:17:13.597 に答える
1

ブライアン、私はあなたとまったく同じ問題を経験しました。_HAS_ITERATOR_DEBUGGINGブログ投稿についてのあなたの回答のおかげで、私はそれを私たちの無効化とまで追跡しました_SECURE_SCL

この問題を解決するために、Boostライブラリを手動で作成しました。設定ファイルをいじる必要はありませんでした。これが私が使用した2つのコマンドラインです:

x86
bjam debug release link = static threading = multi runtime-link = shared define = _SECURE_SCL = 0 define = _HAS_ITERATOR_DEBUGGING = 0 --with-signals stage

x64
bjam debug release link = static threading = multi runtime-link = shared define = _SECURE_SCL = 0 define = _HAS_ITERATOR_DEBUGGING = 0 address-model = 64 --with-signals stage

これにより、次のファイルがビルドされます
。libboost_signals-vc90-mt-1_43.lib
libboost_signals-vc90-mt-gd-1_43.lib

お役に立てば幸いです。

于 2010-09-27T10:49:53.200 に答える
1

私のシステムであなたのコードをテストしましたが、問題なく動作します。あなたのコンパイラと、Boost.Signals ライブラリが構築されているコンパイラとの間に不一致があると思います。Boost ソースをダウンロードし、コードのビルドに使用したのと同じコンパイラを使用して Boost.Signals をコンパイルしてみてください。

参考までに、使用しているコンパイラ (およびバージョン) を教えてください。

于 2008-09-26T00:51:16.857 に答える