相关疑难解决方法(0)

禁止创建临时对象

在多线程应用程序中调试崩溃时,我终于在此语句中找到了问题:

CSingleLock(&m_criticalSection, TRUE);
Run Code Online (Sandbox Code Playgroud)

请注意,它正在创建一个CSingleLock类的未命名对象,因此在此语句之后,临界区对象会立即解锁.这显然不是编码员想要的.此错误是由简单的输入错误引起的.我的问题是,有些我可以防止在编译时自己创建类的临时对象,即上面的代码类型应该生成编译器错误.一般来说,我认为每当一个类尝试进行某种资源获取时,就不应该允许该类的临时对象.有没有办法强制执行呢?

c++ mfc temporary

26
推荐指数
2
解决办法
2419
查看次数

boost :: uuids :: random_generator和多线程的唯一性

当我使用单线程生成随机数时,4M uuids中没有重复生成,但如果我生成两个线程,每个1M,我看到大约16-20个重复.可能是什么原因?

class TestUuid 
{
 public:
  std::string GenerateUUid(){
       boost::uuids::uuid uid;
       {
          boost::mutex::scoped_lock(m_mRandomGen);
          uid = m_oRandomGen();
       }
       std::stringstream ss;
       ss << uid;
       return ss.str();
  }


  void TestUid(std::map<std::string, unsigned>& mUids, unsigned count){  
    for(unsigned i = 0; i < count; ++i) {
        std::string sUid = GenerateUUid();
        std::map<std::string, unsigned>::const_iterator it = mUids.find(sUid);           
        if(it == mUids.end()){
           mUids[sUid] = i;
        }else {
         std::cerr << "Duplicate uid:" << sUid << " found in  thread id:" << pthread_self() << ", counter:" << i << ", earlier counter:" << …
Run Code Online (Sandbox Code Playgroud)

c++ boost thread-safety boost-uuid

8
推荐指数
1
解决办法
3425
查看次数

尝试创建临时对象时出现奇怪的编译器错误

发布此问题后,我尝试重现创建范围RAII对象时意外右值创建的问题.现在看来我没有编译器错误就无法重现它!

在下面的代码示例中,在Test::foo()第二个ScopedLock创建中没有编译.gcc编译器错误似乎完全错误.谁能解释一下?

struct Mutex
{
    void lock() { }

    void unlock() { }
};


struct ScopedLock
{
    ScopedLock(Mutex & inMutex) : mMutex(inMutex)
    { mMutex.lock(); }

    ~ScopedLock()
    { mMutex.unlock(); }

private:
    ScopedLock(const ScopedLock&);
    ScopedLock& operator=(const ScopedLock&);

    Mutex mMutex;
};


struct Test
{
    void foo()
    {
        // Compiles fine
        ScopedLock lock(mMutex);

        // Error: no matching function for
        // call to ‘ScopedLock::ScopedLock()’
        ScopedLock(mMutex);
    }

    Mutex mMutex;
};
Run Code Online (Sandbox Code Playgroud)

我在Mac上使用GCC 4.2.1.

更新

我查看了原始代码,发现该成员是通过this指针引用的:

ScopedLock(this->mMutex); // short-lived temporary and compiles …
Run Code Online (Sandbox Code Playgroud)

c++ most-vexing-parse

3
推荐指数
1
解决办法
228
查看次数