这是我的分配:
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!
答案 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)
请勿在用户代码中使用new
和delete
。使用std::vector<>
。
关于new
和delete
:
所有用new
分配的对象必须由delete
释放,
分配给new[]
的所有对象都必须由delete[]
释放。
还要确保您遵循Rule of 3/5。 (如果不使用智能指针或跟随RAII / RDID的其他对象来包装原始拥有的指针,那么您应该针对Rule of 0 ...就是毫无疑问的。)
答案 2 :(得分:2)
您的代码正在泄漏内存,因为在您的第一个循环中,您一次又一次覆盖相同的指针(丢失先前的值,而这永远不会释放它)。
对于释放,第二个循环是不必要的。这样可以避免您第一次删除指针时,下次迭代尝试删除nullptr时删除。
顺便说一句
答案 3 :(得分:0)
如果您不能放弃指针(有时别无选择),也不想使用任何建议的替代方法,请考虑使用类似SCOPE_EXIT
的{{1}}。然后,您可以执行以下操作:
Boost.ScopeExit