2010-09-28 3 views
0

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

#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) 

ответ

7
RegisterFunction ("Foo", Function(&foo, 1)); 
       ^capital F 
ExternalFuncs ["foo"] (5); 
       ^lowercase f 

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

+0

Jest gites: D Большое спасибо. Когда кто-то пишет такой маленький фрагмент кода, он не смотрит на детали: P – Xirdus

Смежные вопросы