gpt4 book ai didi

c++ - Boost 函数赋值抛出异常

转载 作者:行者123 更新时间:2023-11-30 01:25:25 25 4
gpt4 key购买 nike

当我尝试将一个函数 1 分配给另一个函数 1 时,Boost::function 有十分之一会抛出异常。

任务是 boost::function1<void, void*> 的类型定义.

具体代码如下:

    // the Task object sent in as Task task
void Sleeper(void* arg)
{
int32_t sleepTime = *(int32_t*)arg;

SleepCurrentThread((int32_t)sleepTime);
}

struct ThreadInfo
{
ThreadInfo() : mState(DETACHED), mTask(NULL), mArg(NULL)
{ }

ThreadState mState;
Task mTask;
void* mArg;
};

Thread::Thread(Task task, void* arg, IMemoryAllocator& allocator, ILogManager& logger) : mAllocator(allocator), mLogger(logger)
{
mThreadInfo = (ThreadInfo*) mAllocator.Allocate(sizeof(ThreadInfo)); // simnple heap allocation

mThreadInfo->mArg = arg;
mThreadInfo->mState = Thread::RUNNING;
mThreadInfo->mTask = task; //<--------- throws... sometimes


mHandle = _CreateThread(&Run, (void*)mThreadInfo);
if (!mHandle)
Detach();


}

我在 boost function_template.hpp 中专门追踪到赋值运算符,在这段代码中,它最终抛出:

// Assignment from another BOOST_FUNCTION_FUNCTION
BOOST_FUNCTION_FUNCTION& operator=(const BOOST_FUNCTION_FUNCTION& f)
{
if (&f == this)
return *this;

this->clear();
BOOST_TRY {
this->assign_to_own(f); // <--- throws, and then line below re-throws
} BOOST_CATCH (...) {
vtable = 0;
BOOST_RETHROW;
}
BOOST_CATCH_END
return *this;
}

这是为什么?我的代码有什么容易发现的错误吗?还有什么需要的吗?

谢谢

编辑:我知道我会被要求使用 boost::threads,但我正在尝试我自己的 win32/pthread 包装器,(为了好玩)

最佳答案

您的 struct 有一个非平凡的构造函数,但您没有调用它。它使 Task 成员未初始化。要初始化它,要么使用 new 分配整个对象,要么使用 placement new 来初始化它,如下所示:

    void *mem = mAllocator.Allocate(sizeof(ThreadInfo));  // simnple heap allocation
mThreadInfo = new(mem) ThreadInfo; // placement new

mThreadInfo->mArg = arg;
mThreadInfo->mState = Thread::RUNNING;
mThreadInfo->mTask = task;

Placement new 在已分配的原始(未初始化)内存中构造一个对象。

关于c++ - Boost 函数赋值抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12221821/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com