小编ica*_*bod的帖子

使用typeinfo :: name()后内存泄漏

我有一个程序,其中,部分用于信息日志记录,我输出一些类的名称,因为它们被使用(特别是我在日志中添加一个条目说明Messages::CSomeClass transmitted to 127.0.0.1).我使用类似于以下代码执行此操作:

std::string getMessageName(void) const {
    return std::string(typeid(*this).name());
}
Run Code Online (Sandbox Code Playgroud)

是的,在任何人指出它之前,我意识到输出typeinfo::name是特定于实现的.

根据MSDN

所述type_info::name成员函数返回一个const char*到表示该类型的人类可读名称的空终止字符串.指向的内存是缓存的,永远不应该直接释放.

但是,当我在调试器中退出程序时,任何"新"使用都会typeinfo::name()显示为内存泄漏.如果我输出2个类的信息,我会得到2个内存泄漏,依此类推.这暗示缓存的数据永远不会被释放.

虽然这不是一个主要问题,但它看起来很混乱,经过长时间的调试后,它可以很容易地隐藏真正的内存泄漏.

我环顾四周,发现了一些有用的信息(一个SO答案给出了一些有关如何实现typeinfo的有趣信息),但我想知道这个内存是否应该被系统释放,或者我是否可以做些什么来解决调试时"不注意"泄漏.

我确实有一个备份计划,即getMessageName自己编写方法并不依赖typeinfo::name,但无论如何我想知道是否有我错过的东西.

c++ memory-leaks typeid typeinfo visual-c++

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

更改任意数值类型的值的范围比例

我需要将一个数字集合从一个范围转换为另一个范围,同时保持值的相对分布.

例如,可以缩放包含随机生成的浮点数的向量以适合可能的无符号字符值(0..255).忽略类型转换,这意味着无论提供什么输入(例如-1.0到1.0),所有数字都将缩放到0.0到255.0(或左右).

我创建了一个模板类来执行此转换,可以使用std::transform以下命令将其应用于集合:

template <class TYPE>
class scale_value {
    const TYPE fmin, tmin, ratio;
public:
    TYPE operator()(const TYPE& v) {
        TYPE vv(v);
        vv += (TYPE(0) - fmin); // offset according to input minimum
        vv *= ratio;            // apply the scaling factor
        vv -= (TYPE(0) - tmin); // offset according to output minimum
        return vv;
    }
    // constructor takes input min,max and output min,max
    scale_value(const TYPE& pfmin, const TYPE& pfmax, const TYPE& ptmin, const TYPE& ptmax)
        : fmin(pfmin), tmin(ptmin), …
Run Code Online (Sandbox Code Playgroud)

c++ templates range

6
推荐指数
1
解决办法
2270
查看次数

标签 统计

c++ ×2

memory-leaks ×1

range ×1

templates ×1

typeid ×1

typeinfo ×1

visual-c++ ×1