C++使用std :: set并获得分段错误D:

Fau*_*ult -1 c++ valgrind set segmentation-fault

我不知道我在valgrind中的错误报告告诉我的是什么......但这是我的代码中与该问题相关的部分:

template<typename T>
struct CompareEvents {
public:
    bool operator()(const T a, const T b) const {
        return a.time < b.time ? true : false;
    } 
};


class EventManager {
public:
    void EventManager::SendEvent(int delay, size_t sender, size_t receiver, size_t eventId) {
        if (delay > 0) {
            eventQueue.insert(Event((GetTime() + delay), sender, receiver, eventId));  //line 55
        }
    }
private:
    std::set<Event, CompareEvents<Event>> eventQueue;
}
Run Code Online (Sandbox Code Playgroud)

事件只是一个简单的结构,它有四个参数(时间,发送者,接收者和ID).

从我的测试类调用SendEvent导致一个可爱的seg错误......看起来像这样(valgrind):

==998== Invalid read of size 8
==998==    at 0x40D544: std::_Rb_tree<Event, Event, std::_Identity<Event>, CompareEvents<Event>, std::allocator<Event> >::_M_begin() (stl_tree.h:493)
==998==    by 0x40D8C4: std::pair<std::_Rb_tree_iterator<Event>, bool> std::_Rb_tree<Event, Event, std::_Identity<Event>, CompareEvents<Event>, std::allocator<Event> >::_M_insert_unique<Event>(Event&&) (stl_tree.h:1261)
==998==    by 0x40C44B: std::__cxx1998::set<Event, CompareEvents<Event>, std::allocator<Event> >::insert(Event&&) (stl_set.h:419)
==998==    by 0x40ADE2: std::__debug::set<Event, CompareEvents<Event>, std::allocator<Event> >::insert(Event&&) (set.h:210)
==998==    by 0x40A130: EventManager::SendEvent(int, unsigned long, unsigned long, unsigned long) (EventManager.cc:55)
==998==    by 0x402D07: main (main.cc:28)
==998==  Address 0x10 is not stack'd, malloc'd or (recently) free'd
Run Code Online (Sandbox Code Playgroud)

嗯......难看?main.cc:28是我的SendEvent调用,一个简单的:

EventManager::Instance()->DispatchEvent(3, 1, 1, 1);
Run Code Online (Sandbox Code Playgroud)

(它是作为单例类构建的,以防您想知道Instance()方法).

这就是我的问题.我不能做它的正面或反面,但我不知道,我是否将插入到我的std :: set中?我以前没用过套装,所以可能是这样吗?我需要初始化一些东西吗?我很困惑......

Tha*_*tos 5

没有看到更多信息,这是一个猜测!

我猜EventManager你正在呼唤SendEvent的是NULL.该valgrind错误是告诉你,0x10的是,的valgrind没有关于线索的地址,0x10是一个不错的轮数,可能是16个字节偏移量的结构(EventManager),但你的指针是NULL.NULL + 0x10 = 0x10在大多数平台上.

这是愚蠢的容易检查:让在程序段错误gdb,跳转到的帧SendEvent号召,看是否thisNULL.

  • 所以应该真的给出心灵答案的双重代表.;-P (3认同)