简体   繁体   English

C++ 字符串动态二维数组导致 memory 泄漏

[英]C++ string dynamic 2D array cause memory leak

When I use a string type dynamic 2D array, there is memory leak after deleting the array.当我使用字符串类型的动态二维数组时,删除数组后会出现 memory 泄漏。 Please view the following code:请查看以下代码:

#include <string>
using namespace std;        

#define NEW2D(H, W, TYPE) (TYPE **)new2d(H, W, sizeof(TYPE))

void* new2d(int h, int w, int size)
{
    register int i;
    void **p;

    p = (void**)new char[h*sizeof(void*) + h*w*size];
    for(i = 0; i < h; i++)
    {
        p[i] = ((char *)(p + h)) + i*w*size;
    }

    return p;
}

If I use the following code:如果我使用以下代码:

    string** pstr = NEW2D(2, 4, string);
    memset(pstr[0], 0, sizeof(string)*2*4);

    delete [] pstr;

There is no memory leak; however, if I use the following code:
    string** pstr = NEW2D(2, 4, string);
    memset(pstr[0], 0, sizeof(string)*2*4);

    for (int j = 0; j < 2; j++)
        for (int i = 0; i < 4; i++)
            pstr[j][i] = "test";

    for (int j = 0; j < 2; j++)
        for (int i = 0; i < 4; i++)
            pstr[j][i].clear();

    delete [] pstr;

The memory leak is happened, even if I have called pstr[j][i].clear().即使我调用了 pstr[j][i].clear(),也会发生 memory 泄漏。

What should I do to avoid memory leak after having我应该怎么做才能避免 memory 泄漏后

for (int j = 0; j < 2; j++)
    for (int i = 0; i < 4; i++)
        pstr[j][i] = "test";

in my code?在我的代码中?

The problem with your code because it treats non-trivial types like std::string as if they were trivial.您的代码存在问题,因为它将诸如std::string之类的非平凡类型视为微不足道。 Probably you could create something using placement new that was legal C++ and worked in a similar way to the code you've written可能您可以使用合法 C++ 的位置新创建一些东西,并且以与您编写的代码类似的方式工作

But here's an simple alternative that (hopefully) works但这是一个简单的替代方案(希望)有效

template <typename T>
T** new2d(int h, int w)
{
    T** p = new T*[h];
    T* q = new T[h*w];
    for (int i = 0; i < h; i++)
        p[i] = q + i*w;
    return p;
}

And to delete并删除

template <typename T>
void free2d(T** p, int h)
{
    if (h > 0)
        delete[] p[0];
    delete[] p;
}

Untested code.未经测试的代码。

Thanks to John.感谢约翰。 I have tried the following code, it works well:我已经尝试了以下代码,它运行良好:

int i;
int data_height = 2, data_width = 4;
string **data;
data = new string*[data_height];
for(i = 0; i < data_height; i++)
    data[i] = new string[data_width];

for (int j = 0; j < 2; j++)
    for (int i = 0; i < 4; i++)
        data[j][i] = "test";

for(i = 0; i < data_height; i++)
    delete [] data[i];
delete [] data;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM