如何正确删除那些指针?

时间:2018-10-09 22:28:37

标签: c++ c++11 pointers smart-pointers

这是我的分配:

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];
}

这是我的删除内容:

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;
}

上面的代码可以吗?我可能应该只使用智能指针,但是我不知道代码与它们的外观如何?因此,如果您输入智能指针代码,将不胜感激。这些指针在线程函数中本地使用,不与任何对象共享。

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

TIA!

4 个答案:

答案 0 :(得分: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);

答案 1 :(得分:5)

请勿在用户代码中使用newdelete。使用std::vector<>

关于newdelete

所有用new分配的对象必须由delete释放,
分配给new[]的所有对象都必须由delete[]释放。

还要确保您遵循Rule of 3/5。 (如果不使用智能指针或跟随RAII / RDID的其他对象来包装原始拥有的指针,那么您应该针对Rule of 0 ...就是毫无疑问的。)

答案 2 :(得分:2)

您的代码正在泄漏内存,因为在您的第一个循环中,您一次又一次覆盖相同的指针(丢失先前的值,而这永远不会释放它)。

对于释放,第二个循环是不必要的。这样可以避免您第一次删除指针时,下次迭代尝试删除nullptr时删除。

顺便说一句

  • 使用nullptr代替NULL
  • 您也可以使用shared_ptr或unique_ptr代替原始指针。
  • 如果可行,请使用向量而不是数组。

答案 3 :(得分:0)

如果您不能放弃指针(有时别无选择),也不想使用任何建议的替代方法,请考虑使用类似SCOPE_EXIT的{​​{1}}。然后,您可以执行以下操作:

Boost.ScopeExit