刪除c++ string類型動態2D陣列內存遺漏

在刪除string類型的動態2維陣列時,出現內存遺漏
code如下:

#include 
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;
}
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";

delete [] pstr;

運行delete [] pstr後,關閉程序出現內存遺漏警告

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;

即使加入pstr[j][i].clear(), 依然會出現內存遺漏

詢問如何做才能避免在使用pstr[j][i] = "test"之後刪除pstr導致內存遺漏

謝謝樓上的提示,找到答案了

int data_height = 2, data_width = 4;
string **data;
data = new string*[data_height];
for(int 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(int i = 0; i < data_height; i++)
    delete [] data[i];
delete [] data;

delete [] pstr;
这是不够的,pstr是指针的指针,你需要跟内存分配一样,用双循环进行释放,先释放内层指针,再释放外层指针的指针。delete []pstr只是释放了外层的指针的指针而已