gpt4 book ai didi

c++ - 类转换(有点复制)构造函数指向类的指针

转载 作者:搜寻专家 更新时间:2023-10-31 00:38:17 24 4
gpt4 key购买 nike

最近我从一家外部公司那里得到了一段代码,看起来有点奇怪。所以我的问题是:有人可以向我解释以下代码设计的优点和缺点吗?

有一个

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;

然后我在代码中到处都发现了很多这些小 gem :

mapOfA.insert(std::make_pair("elite", new A(1.337)));

特别注意A前的那个“new”!据我所知,关键字“new”在堆中分配内存,必须再次使用 delete 将其删除(boost 指针和类似指针除外),我希望它现在仍然正确。 ;)

因此代码在堆上创建一个对象,通过指针将其传递给那个特殊的指针转换复制构造函数,该构造函数又通过值将自身传递给 std::make_pair,因为映射想要存储整个对象而不是一个指针。到目前为止我是否理解这一点?出于好奇,我评论说“复制”-构造函数,正如我所料,它在每个小 gem 上都出现了编译器错误(要求从 A* 转换为非标量类型 A)。

鉴于它是用 GCC 4.1.2 编译的,是否涉及任何机制,我不知道它是否真的有用?在我看来,这只是非常糟糕的做法!它不仅速度慢而且内存泄漏很多,不是吗?

编辑:

我更改为 array of double 因为人们评论了很多关于 memcpy 功能的地方,这实际上是好的,因为它实际上是一个 boost::shared_array 我只是为了示例目的而简化了。

最佳答案

Given it is compiled with a GCC 4.1.2 is there any mechanism involved i dont know that makes this actually usefull?

没有。这只是糟糕的代码。您可以清理它(您可能应该从删除 A(A* const& a) 代码开始)。

In my opinion its just really bad practice!

它为它生成的每个元素分配/泄漏一个元素。它还使用 memcpy(显然不是赋值?)。

Not only is it slow but also leaks memory alot, isnt it?

是的。

如果我猜有人在从指针初始化时试图实现一个移动构造函数,并把它弄得一团糟(可能是在 C++11 之前?)。不过这只是一个猜测。

关于c++ - 类转换(有点复制)构造函数指向类的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18357445/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com