2017-07-17 235 views
1

如果我通过下面一行获取一块内存。C++中指针变量的内存释放

int* a = new int[10]; 

然后释放内存,该代码将是

delete [] a; 

但是,如果我采取单个存储器段的指针像下面

int* a = new int; 

然后插入的阵列数据如下。

for(int i=0;i<10;i++) 
{ 
    a[i]= i ; 
} 

所以以释放所述第一存储器区段指针“一”指向,代码会像以下

delete a; 

但是在这里,我插入从存储器更多数据指针“a”指向。所以我在这里实际使用了10个内存段。我怎样才能释放所有这10个内存?请帮我解答。

+4

这是未定义的行为(你不能这样做)。 – 2017-07-17 20:10:10

+0

但是在代码块中,我能够从分配的单个内存开始插入数据的数组。 –

+3

@hasibuzzamanchowdhury不,你不是,只是因为它看起来像它的作品并不意味着它不是未定义的。 –

回答

5

我该如何释放所有这10个内存?

你不能和你不应该因为一时你试图“插入数据的阵列像下面”您已进入未定义行为的土地用于写入,你没有与分配的位置首先是new。你问了一个单一的int,你有一个单一的int。不要写过去。

1

您只分配了一个int。从a[1]a[9]的内存可能会分配给其他对象,并且可能会损坏它们。

P.S.顺便说一句,你不能释放你在任何情况下都没有分配的内存。

+0

所以看起来,创建这样的数组不是一个好主意? –

+1

@hasibuzzamanchowdhury正确。不是一个好主意。使用'std :: vector',如果您担心可能会出现界限,请使用'at'方法而不是'[]'。 – user4581301

+0

当然。根据需要分配尽可能多的内存,不要写入未分配的内存。 –

0

new int一个int值分配空间。你不能合法地假装它是一个包含十个int值的数组,如果你超出范围,编译器将不会生成代码来扩展分配的内存。你写的代码产生未定义的行为。它编译并运行的事实不会改变这一点;迟早会引起问题。

要分配一个可以保存10 int值的数组,请使用第一个表达式:new int[10]。这将为十个int值分配空间。

要分配可以随意扩展的数组,请使用std::vector<int>

+0

我得到了我的答案,非常感谢 –