Ошибка сегментации с использованием FastDelegate - PullRequest
0 голосов
/ 28 сентября 2010

У меня проблема с моим тестовым кодом. Он хорошо компилируется, но когда я пытаюсь вызвать делегат, происходит сбой программы.

#include "..\libs\FastDelegate\FastDelegate.h"
#include <string>
#include <map>
#include <iostream>

typedef fastdelegate::FastDelegate1 <int, int> FuncPtr;

struct Function
{
 FuncPtr Ptr;
 int Param;
 Function() {};
 Function (FuncPtr Ptr_, int Param_): Ptr (Ptr_), Param (Param_) {};
 int operator() (int xxx) {return Ptr(xxx);};
};

std::map <std::string, Function> ExternalFuncs;

bool RegisterFunction (const std::string& a, const Function b)
{
 ExternalFuncs[a] = b;
 return true;
}

int foo (int bar)
{
 std::cout << "Jest gites";
 return 0;
}

int main()
{
 RegisterFunction ("Foo", Function(&foo, 1));
 ExternalFuncs ["foo"] (5);
}

CallStack:

#0 00000000 0x00000000 in ??() (??:??)
#1 0041F209 fastdelegate::FastDelegate1<int, int>::operator() (this=0x3e256c, p1=5) (F:/Projekty/aaa/../libs/FastDelegate/FastDelegate.h:991)
#2 0041D774 Function::operator() (this=0x3e256c, xxx=5) (F:\Projekty\aaa\main.cpp:14)
#3 00401526 main() (F:\Projekty\aaa\main.cpp:34)

1 Ответ

7 голосов
/ 28 сентября 2010
RegisterFunction ("Foo", Function(&foo, 1)); 
                   ^ capital F
ExternalFuncs ["foo"] (5); 
                ^ lowercase f

Поскольку на карте нет элемента с ключом "foo", ExternalFuncs["foo"] default создает новый Function, вставляет этот построенный объект по умолчанию в карту и возвращает ссылку на него; Затем вы вызываете operator() для этого объекта, который пытается разыменовать неинициализированную переменную-член Ptr. Плохие вещи случаются.

...