小编kor*_*123的帖子

重载运算符 delete 以不删除对象 - 有效或未定义的行为?

前言:我正在优化一个旧的代码库。

我有一个命名的类Token,我为令牌的子集(但不是全部)添加了缓存。缓存的令牌可能不会被删除,因为它们的指针在程序的整个生命周期内都存储在内存中的永久集合中。

不幸的是,代码库delete token到处都是。所以我所做的是添加一个bool cached从内部检查的成员Token::operator delete和析构~Token()函数,如果cached为真,它会立即从这些各自的函数返回。

我的问题是,这是未定义的行为,还是我可以这样做?delete在没有被删除的东西上执行操作符可以吗?或者这会在未来咬我吗?

class Token
{
    bool cached;
    void* data;

public:
    ~Token()
    {
        if (this->cached) return;
        free(data);
    }

    void operator delete(void* p)
    {
        if (((Token*)p)->cached) return;
        ::operator delete(p);
    }

    // operator new, constructor etc.

}
Run Code Online (Sandbox Code Playgroud)

c++

4
推荐指数
1
解决办法
71
查看次数

关闭 LoadLibrary 打开的 DLL 文件句柄

如何LoadLibrary在保持库加载的同时关闭通过.dll 调用打开的文件句柄?FreeLibrary例如将不起作用。

就我而言,有一个程序我想保持打开状态,该程序打开了 DLL,但我不想在每次重新编译和替换 DLL 时都关闭该程序。我不在乎程序内存中是否有旧版本的库。DLL 也被另一个程序使用,这就是我希望能够替换它的原因。

c++ windows dll winapi

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

标签 统计

c++ ×2

dll ×1

winapi ×1

windows ×1