-1

void (*Draw)(WidgetVisualization *);WidgetVisualization.h のクラス WidgetVisualization に関数ポインターがあります。

私はextern void GraphicVisualizationDraw(WidgetVisualization *w)WidgetVisualization.cpp を持っています。

WidgetVisualization のコンストラクターで、 を割り当ててDraw = GraphicVisualizationDraw;います。

LCDGraphic.cpp の関数は次のとおりです。

void GraphicVisualizationDraw(WidgetVisualization *widget) {

}

関数ポインター 'Draw' を function に割り当てようとするとGraphicVisualizationDraw、無効な書き込みが発生します。どんな手掛かり?

valgrind からの出力は次のとおりです。

==8281== Invalid write of size 4
==8281==    at 0x52D12C7: LCD::WidgetVisualization::WidgetVisualization(LCD::LCDCore*, std::string, Json::Value*, int, int, int) (WidgetVisualization.cpp:72)
==8281==    by 0x530F0C3: LCD::LCDCore::BuildLayouts() (LCDCore.cpp:342)
==8281==    by 0x5306A07: LCD::LCDControl::ConfigSetup() (LCDControl.cpp:213)
==8281==    by 0x53062EC: LCD::LCDControl::Start() (LCDControl.cpp:57)
==8281==    by 0x52D84E4: (anonymous namespace)::lcdcontrol_init(_VisPluginData*) (actor_lcdcontrol.cpp:115)
==8281==    by 0x40645FA: visual_plugin_realize (lv_plugin.cpp:207)
==8281==    by 0x405B1E7: visual_actor_realize (lv_actor.cpp:265)
==8281==    by 0x404C02B: visual_bin_realize (lv_bin.c:108)
==8281==    by 0x80507D1: main (lv-tool.cpp:378)


WidgetVisualization::WidgetVisualization(LCDCore *v, std::string n, Json::Value *section, int row, int col, int layer) : Widget(v, n, section, row, col, layer,
    WIDGET_TYPE_VISUALIZATION | WIDGET_TYPE_RC | WIDGET_TYPE_SPECIAL) {

    LCDError("widgetvisualization: layer: %d", layer_);

    if(lcd_type_ == LCD_TEXT)
        Draw = TextVisualizationDraw;
    else if(lcd_type_ == LCD_GRAPHIC)
        Draw = GraphicVisualizationDraw;// line 72
    else
        Draw = 0;
4

1 に答える 1

0

このエラーは、クラス自体のコードには関係ないようで、WidgetVisualizationクラスのオブジェクトが作成されるメモリ位置に関係があるようです。

問題は、Draw の初期化が実行されるときに、オブジェクトが正しくない位置にあることをランタイムが認識したときです。

スタック トレースに続いて:

==8281== Invalid write of size 4
==8281==    at 0x52D12C7: LCD::WidgetVisualization::WidgetVisualization(LCD::LCDCore*, std::string, Json::Value*, int, int, int) (WidgetVisualization.cpp:72)
==8281==    by 0x530F0C3: LCD::LCDCore::BuildLayouts() (LCDCore.cpp:342)

呼び出されたメンバー関数BuildLayouts()は、このオブジェクトの不適切な割り当てを行っているものの良い候補のようです。そのコードを再確認する必要があります。

于 2012-05-04T11:00:19.800 に答える