【问题标题】:C++ memory leakage: new a pointer in function and delete outsideC ++内存泄漏:在函数中新建一个指针并在外部删除
【发布时间】:2025-11-25 14:15:01
【问题描述】:

我的代码是这样的:

// a function that new a char pointer and return it
Unsigned char* RGB2GS(Unsigned char* pRgb, int nw, int nh, int nbpp) {
    unsigned char* pGs = new unsigned char[nw*nh*nbpp];

    // code for rgb to gs...//
    return pGs;
}

int main() {
    unsigned char* pmyRgb = ReadBmp(filename);//size 1024x1024, RGB
    unsigned char* pMyGs = NULL;
    pMyGs = RGB2GS(pmyRgb, 1024, 1024, 24);
    delete[] pMyGs ;
    delete[] pmyRgb ; // correct typo

我发现有内存泄漏(来自 VS2010 日志)。我在函数内部创建了一个指针并返回它。但是我删除了函数外的指针。这种用法有问题吗?谢谢

【问题讨论】:

  • 为什么要删除两次?
  • 另外,编写这样的代码只是要求泄漏。使用 RAII!
  • 为什么这段代码要求泄露?我试图实现函数 rgb2gs。我认为在其中创建 GS char 指针并返回更合乎逻辑。但是请告诉我这样做的更好方法是什么?非常感谢。
  • 这是要求泄漏,因为如果RGB2GS 中的new 抛出,pmyRgb 将永远不会被删除。请改用std::vector<unsigned char>

标签: c++ function memory-leaks


【解决方案1】:

泄露的内存可能是 BMP 数据,pmyRgb。检查该功能的文档。你已经删除了pMyGs 的内存就好了。重复两次通常不会有害,但没用。

【讨论】:

    【解决方案2】:

    多次删除内存将产生不可抗拒的行为。在函数中分配内存,返回它,删除另一个地方并没有错。需要注意的是delete[]delete 之间是有区别的,但是由于您将内存分配为数组,所以delete[] 可以安全使用。

    The difference between delete and delete [] in C++enter link description here

    【讨论】:

    • 对不起,我打错了。应该是: delete[] pMyGs ;删除[] pmyRgb ;所以我想我的代码应该不会有内存泄漏吧?
    • 查看您粘贴的代码,我没有看到任何泄漏:)