Back to Top

未命名对象的析构时机

这两天查到了一个RAII用错的bug, 记录一下. 错误代码如下:

#define SCOPED_SCENE_READ_LOCK(pxScene) physx::PxSceneReadLock(*pxScene, __FILE__, __LINE__)

这段代码本意是使用宏封装读写锁, 利用RAII特性, 当作用域结束的时自动释放掉锁.

但宏中没写变量名, 成了一个未命名对象, 其生命周期是声明后立即释放, 未达到给代码块加锁的目的.

以下是验证代码:

struct test_obj {
        test_obj(const char *s) {
                printf("test_obj constructor:%s\n", s);
        }

        ~test_obj() {
                printf("test_obj destructor\n");
        }
};

void test_unnamed() {
        test_obj("test_unnamed");
        printf("test_unnamed\n");
}

void test_named() {
        test_obj o("test_named");
        printf("test_named\n");
}

当执行test_unnamed时, 输出为:

test_obj constructor:test_unnamed
test_obj destructor
test_unnamed

当执行test_named时, 输出为:

test_obj constructor:test_named
test_named
test_obj destructor

避免方法

VS下会提示C26444的警告