我有一个程序,其中,部分用于信息日志记录,我输出一些类的名称,因为它们被使用(特别是我在日志中添加一个条目说明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
,但无论如何我想知道是否有我错过的东西.
我需要将一个数字集合从一个范围转换为另一个范围,同时保持值的相对分布.
例如,可以缩放包含随机生成的浮点数的向量以适合可能的无符号字符值(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)