最近我从一家外部公司获得了一段代码,这似乎有点奇怪。所以我的问题是:有人能解释一下以下代码设计的优缺点吗?
有一个
class A
{
double val[2]; // actually within the original class there are:
// an int, two std::string,a boost::any(for a double and double*)
// and a boost::shared_array<int>
public:
A(double value1, double value2)
{
val[0] = value1;
val[1] = value2;
}
// with normal constructor stuff here, but also
A(A* const& a) // a pointer-to-object "copy"-constructor?!
{
memcpy(this->val, a->val, sizeof(double) * 2 );
// no delete here either...
}
}
它用于 std::map 之类的(不是指针映射!)
typedef std::map<std::string, A> aMap;
aMap mapOfA;
然后我在代码中到处都发现了很多这些小宝石:
mapOfA.insert(std::make_pair("elite", new A(1.337)));
特别注意A之前的那个“新”!据我所知,关键字“new”在堆中分配内存,必须再次用 delete 删除(boost 指针和类似的除外),我希望它现在仍然正确。;)
所以代码在堆上创建了一个对象,通过指针将它传递给那个特殊的指针转换复制构造函数,该构造函数又通过值将自己传递给std::make_pair,因为映射想要存储整个对象而不是指针。到目前为止我是否理解这一点?出于好奇,我评论了“复制”-构造函数,它在每个小宝石上都给出了我预期的编译器错误(从 A* 转换为非标量类型 A 请求)。
鉴于它是用 GCC 4.1.2 编译的,是否有任何我不知道的机制使这实际上有用?在我看来,这只是非常糟糕的做法!不仅速度慢,而且内存泄漏很多,不是吗?
编辑:
我更改为 double 数组,因为 ppl 对实际上没问题的 memcpy 功能进行了很多评论,因为它实际上是一个 boost::shared_array 我只是出于示例目的而简化了。