繁体   English   中英

在Linux C ++ PowerPC上由于SIGABRT而崩溃

[英]Crash due to SIGABRT on Linux C++ PowerPC

我的程序在分配字符串时崩溃。 我无法确定确切原因。 多个线程执行相同的代码。

这是我的代码。

 char* cTemp = new char[5];
    memset(cTemp,'\0', 5);
    snprintf(cTemp , 5 , "%04x" , iParameter);
    string sVar1 = cTemp;
    delete[] cTemp;
    if(sVar1 == "0")
    sVar1 = "0000";
    pSharedLib->setVar1(sVar1);

设置的函数(在共享库中)

 bool A::setVar1(CString& temp)
    {   
    m_sVar1= temp;
    return true;
    }

崩溃bt显示错误为

#0 0x48194444 in raise () from /lib/libc.so.6
#0 0x48194444 in raise () from /lib/libc.so.6
No symbol table info available.
#1 0x48199694 in abort () from /lib/libc.so.6
No symbol table info available.
#2 0x481d4ecc in ?? () from /lib/libc.so.6
No symbol table info available.
#3 0x481e14d4 in ?? () from /lib/libc.so.6
No symbol table info available.
#4 0x481e32b0 in free () from /lib/libc.so.6
No symbol table info available.
#5 0x480df8b8 in operator delete(void*) () from /usr/lib/libstdc++.so.6
No symbol table info available.
#6 0x480b136c in std::string::_Rep::_M_destroy(std::allocator<char> const&)
() from /usr/lib/libstdc++.so.6
No symbol table info available.
#7 0x480b35f4 in std::string::assign(std::string const&) ()
from /usr/lib/libstdc++.so.6
No symbol table info available.

我看不到任何保护m_sVar1集的同步对象。 您提到可以同时从多个线程调用setVar1,STL的线程保证不保证从多个线程进行分配是安全的。

我怀疑这个问题的关键是

多个线程执行相同的代码。

如果只有一个字符串m_sVar1 ,并且有多个线程同时分配给它,那么竞争条件将导致损坏的可能性很大。 您需要使用关键部分适当地保护该变量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM