在C ++中删除后,为什么我不能重用动态分配的数组的名称?

时间:2016-01-29 07:34:02

标签: c++ arrays dynamic-memory-allocation redefinition

所以,我给出了一些如何使用动态分配的2d数组的示例,并且即将发送基本上如下的代码:

    public override IEnumerable<IColumnInformation> GetTableColumnList(ITableInformation table)
    {
        var result = new List<IColumnInformation>();

        // if the table is flagged as excluded bail with empty list
        if (table.Exclude)
        {
            return result;
        }

        var strb = new OracleClient.OracleConnectionStringBuilder(this.ConnectionString);
        DataTable columns;
        using (var connection = new OracleClient.OracleConnection(ConnectionString))
        {
            // Connect to the database then retrieve the schema information.
            connection.Open();
            columns = connection.GetSchema("Columns");
            if (columns != null && columns.Rows.Count > 0)
            {
                columns.AsEnumerable().ToList()
                    .ForEach(t => result.Add(new ColumnInformation(
                        t.Field<string>("COLUMN_NAME"),
                        t.IsNull("LENGTH") ? 0 : t.Field<int>("LENGTH"),
                        null, 
                        t.Field<string>("OWNER"),
                        false, 
                        table)));
                }
        }
        return result;
    }
public ColumnInformation(string name, int length, Type type, string databaseType, bool exclude = false, ITableInformation parent = null)
        {
            this.Name = name;
            this.Length = length;
            this.Type = type;
            this.DbType = databaseType;
            this.Exclude = exclude;
            this.Parent = parent;
          }

这给了我一个重定义错误,但我认为delete []释放了内存中的空间(因此'arr')。我知道如何解决这个问题(新的数组名称,不要删除[] /重新定义),但我想知道实际发生了什么导致错误?

2 个答案:

答案 0 :(得分:7)

您可能想尝试一下:

int size = 5;
int* arr = new int[ size ];
for( int i = 0; i < size; i++ )
    arr[ i ] = i;
delete[] arr;

size = 10;
arr = new int[ size ]; //<-- no int* here, we just need to reassign
for( int i = size; i > 0; i-- )
    arr[ i ] = i;
delete[] arr;

我们确实要释放内存块,但这并不意味着我们正在删除int * arr。我们刚刚删除了它的内容&#39;

我们删除它后,它只是一个非指定的指针。

答案 1 :(得分:1)

arr被宣告两次。您可以重复使用它,但不能再次声明它。

size = 10;
int* arr = new int[ size ];