如何正确删除这些指针?

Igo*_*gor 0 c++ pointers smart-pointers c++11

这是我的分配:

for (int i = 0; i < numCols; i++)
{
    columnNameLen = new SQLSMALLINT *[numCols];
    columnDataType = new SQLSMALLINT *[numCols];
    columnDataSize = new SQLULEN *[numCols];
    columnDataDigits = new SQLSMALLINT *[numCols];
    columnDataNullable = new SQLSMALLINT *[numCols];
    columnData = new SQLWCHAR *[numCols];
    columnDataLen = new SQLLEN *[numCols];
    columnName = new SQLWCHAR *[numCols];
}

for (int i = 0; i < numCols; i++)
{
    columnNameLen[i] = new SQLSMALLINT;
    columnDataType[i] = new SQLSMALLINT;
    columnDataSize[i] = new SQLULEN;
    columnDataDigits[i] = new SQLSMALLINT;
    columnDataNullable[i] = new SQLSMALLINT;
    columnDataLen[i] = new SQLLEN;
    columnName[i] = new SQLWCHAR[256];
}
Run Code Online (Sandbox Code Playgroud)

这是我的删除:

for (int i = 0; i < numCols; i++)
{
    delete columnNameLen[i];
    columnNameLen[i] = NULL;
    delete columnDataType[i];
    columnDataType[i] = NULL;
    delete columnDataSize[i];
    columnDataSize[i] = NULL;
    delete columnDataDigits[i];
    columnDataDigits[i] = NULL;
    delete columnDataNullable[i];
    columnDataNullable[i] = NULL;
    delete columnData[i];
    columnData[i] = NULL;
    delete columnDataLen[i];
    columnDataLen[i] = NULL;
    delete[] columnName[i];
    columnName[i] = NULL;
}

for (int i = 0; i < numCols; i++)
{
    delete[] columnNameLen;
    columnNameLen = NULL;
    delete[] columnDataType;
    columnDataType = NULL;
    delete[] columnDataSize;
    columnDataSize = NULL;
    delete[] columnDataDigits;
    columnDataDigits = NULL;
    delete[] columnDataNullable;
    columnDataNullable = NULL;
    delete[] columnData;
    columnData = NULL;
    delete[] columnDataLen;
    columnDataLen = NULL;
    delete[] columnName;
    columnName = NULL;
}
Run Code Online (Sandbox Code Playgroud)

代码是否正常?我可能应该只使用智能指针,但我不知道代码将如何与它们一起使用?因此,如果您投入智能指针代码,将非常感激.这些指针在线程函数中本地使用,不与任何东西共享.

我担心第二个循环需要delete而不是delete[].

TIA!

Cal*_*eth 7

你不应该这里使用指针.

using SQLSTRING = std::basic_string<SQLWCHAR>;

struct Column
{
    SQLSTRING Name;
    SQLSTRING Data;
    SQLSMALLINT DataType;
    SQLULEN DataSize;
    SQLSMALLINT DataDigits;
    SQLSMALLINT DataNullable;
}

std::vector<Column> columns(numCols);
Run Code Online (Sandbox Code Playgroud)


Swo*_*ish 5

不要在用户代码中使用newdelete.使用std::vector<>.

关于newdelete:

分配的所有对象new都必须被释放delete,
所有分配的对象new[]都必须被释放delete[].

还要确保遵循3/5规则.(如果不使用智能指针或其他跟随RAII/RDID的对象来包装原始拥有指针,那么你应该瞄准的规则 ... ...是不可能的.