【问题标题】:Memory management when working with pointers in C++在 C++ 中使用指针时的内存管理
【发布时间】:2013-03-29 14:35:16
【问题描述】:

我有这些情况,我想知道我是否正确管理我的记忆。当我启动可执行文件时,我在任务管理器中观察内存消耗,并查看内存如何没有弹回初始数量,这让我怀疑我没有在需要的地方清除内存。 因此,在第一种情况下,我有一个向动态数组添加新元素的函数:

struct Color {
    int R;
    int G;
    int B;
}

int TotalColors;
Color* Rainbow;

void AddColor(Color NewColor) {
    // So, I create a new array of size TotalColors+1
    Color* NewRainbow = new Color[TotalColors+1];
    // Now I add the existing elements
    for (int i=0; i<TotalColors; i++) {
        NewRainbow[i] = Rainbow[i];
    }
    // And lastly, I add the new element
    NewRainbow[TotalColors] = NewColor;
    // Now, I assign the NewRainbow to Rainbow (I don't know if it's correct)
    Rainbow = NewRainbow;
}

那么,在这种情况下,你认为我错过了什么吗?这是可行的,但我想确保从内存中删除未使用的东西。 我还有一个删除元素的功能,如下所示:

void RemoveColor(Color Removable) {
    // Again, I create a new array of size TotalColors-1
    Color* NewRainbow = new Color[TotalColors-1];
    // I scan the list and add only those elements which are not 'Removable'
    for (int i=0; i<TotalColors; i++) {
        // Let's suppose that Removable exists in the list
        if (Rainbow[i].R != Removable.R && Raibow[i].G != Removable.G && ... {
            NewRainbow [i] = Rainbow[i];
        }
    }
    // Again, the same operation as above
    NewRainbow[TotalColors] = NewColor;
    Rainbow = NewRainbow;
}

在这种情况下,我不知道 Rainbow[Removable] 会发生什么,我的意思是,被移除的数组元素。 最后一种情况是,我尝试将元素的指针从数组发送到函数。

Color* GetColor(int Index) {
    Color* FoundColor;
    // Scan the array
    for (int i=0; i<TotalColors; i++) {
        if (i == Index) FoundColor = &Rainbow[i];
    }
    return FoundColor;
}

// And I use it like this
void ChangeColor(int Index) {
    Color* Changeable;
    Changeable = GetColor(Index);
    SetRGB(Changeable, 100, 100, 100);
}

// And this is what changes the value
void SetRGB(Color* OldRGB, int R, int G, int B) {
    (*oldRGB).R = R;
    (*oldRGB).G = G;
    (*oldRGB).B = B;
}

就是这样。所以,这行得通,但我不确定是否有这么多指针我没有忘记删除一些东西。例如,当我RemoveColor 时,我没有看到内存发生了变化(也许某些字节并没有什么不同),我只想让专业人士告诉我是否遗漏了什么。谢谢!

【问题讨论】:

  • 管理原始指针确实很棘手。有理由不使用智能指针吗?
  • 刚刚学习。我也可以使用向量。谢谢

标签: c++ arrays pointers memory-management


【解决方案1】:

在第一个函数AddColor() 中,您不会删除先前分配的内存。

Rainbow = NewRainbow; // leaking the memory Rainbow was previously pointing to.

将最后一行更改为:

delete[] Rainbow;
Rainbow = NewRainbow;

RemoveColor() 相同

任何时候你使用new 操作符都需要有一个对应的delete。此外,如果您使用new[] 分配一个数组,就像您的情况一样,它必须有一个对应的delete[]

【讨论】:

  • 当然比手动配对new/deletenew[]/delete[]等还是使用RAII。
【解决方案2】:

为了不担心您是否忘记删除指针,您不应该使用普通指针。相反,请使用智能指针,例如

std::shared_ptr
std::unique_ptr
etc.

或者,如果您还没有 C++11,请使用

boost::shared_ptr
boost::scoped_ptr

有关智能指针的更多信息,请参阅Wikipedia 和具体文档。

【讨论】:

  • 在继续使用智能指针之前,请充分了解使用 newdelete 的 C++ 内存管理。它们功能强大,确实可以为您省去一些麻烦,但也会引入它们自己的问题,如果您一般不完全了解 C++ 内存管理,这些问题可能难以追踪。
猜你喜欢
  • 2015-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-24
  • 1970-01-01
  • 2013-06-15
  • 1970-01-01
相关资源
最近更新 更多