gpt4 book ai didi

c++ - 在 C++ 中重新分配指针数组,仅使用 new 和 delete

转载 作者:行者123 更新时间:2023-11-28 00:18:40 25 4
gpt4 key购买 nike

Carray.h

#ifndef CARRAY_H
#define CARRAY_H

#include "Cell.h"
#include "Pirate.h"

class CArray
{
public:
CArray();
~CArray();
int getSize();
Cell* get(int);
int add(Cell*);
private:
int size;
Cell** elements;
};

#endif

CArray.cc

CArray::CArray() : size(0)
{
elements = new Cell*[size];
}

CArray::~CArray()
{
for (int i=0; i<size; ++i)
delete elements[i];
}

int CArray::add(Cell* cell)
{
Cell** tmp = new Cell*[size];
tmp = elements;
elements = new Cell*[size+1];

for (int i = 0; i < size; i++){
*(elements + i) = *(tmp + i);
}

*(elements + size) = cell;

delete [] tmp;

size++;
}

最后一个函数会导致内存泄漏,我不确定是哪里发生的。我所知道的是,每个 new 必须与 delete 匹配,每个 new[] 必须与 delete[] 匹配。然而,在 valgrind 中测试它并在我重新分配元素之前尝试删除 [] 元素会给我一个段错误。如果有人能解释我哪里出错了,我会是一个快乐的露营者。如果这是重复的,我很抱歉,但我找不到足够具体的内容来解决我的问题。

最佳答案

您正在为 tmp 分配,然后立即丢失通过分配给 tmp 返回给您的指针:

Cell** tmp = new Cell*[size];
tmp = elements;

上面的行产生内存泄漏,因为 new 返回的值在第二行执行后立即丢失。

All I know is that each new must be matched with a delete and each new[] with a delete[].

这不是唯一要考虑的事情。 new/new[] 返回的 必须与调用 delete/delete[] 时使用的 相同>。

要修复您的功能,您应该这样做:

int CArray::add(Cell* cell)
{
Cell** tmp = new Cell*[size + 1];

for (int i = 0; i < size; i++)
tmp[i] = elements[i];
tmp[size] = cell;

++size;
delete [] elements;
elements = tmp;
return 1;
}

请注意元素是如何复制到 tmp 数组的,然后只需简单地删除旧内存(即 elements)并分配给 elements 新数据。

此外,还有另一个微妙的错误,您有一个 int 的返回值,但您没有返回任何内容。不从一个声称它返回一个值的函数返回一个值是未定义的行为

关于c++ - 在 C++ 中重新分配指针数组,仅使用 new 和 delete,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28682017/

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