【发布时间】:2022-01-15 00:43:48
【问题描述】:
这是我在复制构造函数中深度复制字符串的代码 那么逻辑是否正确??我认为可能存在内存泄漏,我正在尝试修复该问题。m.pStatus 已初始化
class Monkey
{
public:
// insert your code here
Monkey();
Monkey(const Monkey& m);
Monkey& operator=(const Monkey& m);
~Monkey();
// accessors
int getX();
int getY();
char *getStatus();
void deepCopy(const Monkey& m);
// global variables (incremented each creation or destruction)
static int numStringsCreated;
static int numStringsDestroyed;
private:
// Do not change this data
int x;
int y;
char *pStatus;
};
void Monkey::deepCopy(const Monkey& m)
{
if (m.pStatus)
{
// allocate memory for our copy
pStatus= new char[sizeof(m.pStatus)];
for (int i{ 0 }; i < sizeof(m.pStatus); ++i)
pStatus[i] = m.pStatus[i];
}
else
pStatus = nullptr;
}
Monkey::Monkey(const Monkey& m)
{
deepCopy(m);
numStringsCreated++;
}
【问题讨论】:
-
sizeof(m.pStatus)很可能是错误的,但如果没有看到定义,我们只能猜测。你可能想要strlen。考虑minimal reproducible example。如果pStatus指向之前分配的内存,那么这也是内存泄漏。 -
如果
pStatus是指针 sizeof(pStatus) 是错误的。它返回指针本身的字节数,对于 32 位代码可能为 4,对于 64 位代码可能为 8。您可能想使用 strlen() -
你为什么不使用
std::string? -
new char[]不是字符串,而是字符数组。如果您要在C++中编码,请使用提供给您的工具,而不是旧的C东西。否则,你就是那种被称为C+开发人员的奇怪品种:-) -
@paxdiablo 是更好,更差,还是和三星级程序员一样?
标签: c++ constructor deep-copy