2013-10-20 25 views
1

说我有这样的:指针在分配之前是否占用内存?

int *thing; 

在于,使用4个字节的内存,即使我什么也没有分配给它?当我分配一些东西(thing=new int;)时,它会使用8个字节,因为指针本身可能使用内存?

而且,说我有这样的:

struct thingy 
{ 
    int *intThing; 
} 

thingy *result=new thingy; 
thingy.intThing=new int; 
delete thingy; 

intThing被删除为好,或将内存悬空周围什么也没有指向它?

+0

显然它占用空间;当你声明一个变量时,会为它分配存储空间(除非编译器将它优化掉,但我们不要谈论它)。而“删除”并不意味着“从内存中物理删除”。它只是意味着“告诉操作系统我不打算再使用这个内存区域”。 – 2013-10-20 05:44:07

+0

指针是一个“保存”地址的变量,但这并不改变简单的事实,它仍然是一个变量,因此它是可寻址的,因此占用空间本身。那里的空间“是”是另一回事,但它总是必须坐在“某个地方”。 – WhozCraig

回答

1

所有变量(基本数字类型,类实例,指针,引用)开始占用空间。

然后都要涉及到优化,并可能显示一些存储是多余的(该值是恒定的,或者从另一个变量总是可用的,等等)

决策变量消失时的优化,因为明确的目标之一它倾向于减少注册压力,提高缓存性能等。

在您的示例中,指针intThing将被销毁(它是一个成员,并且成员在他们的父对象时死掉),但它指向的内存正确地被称为*thingy.intThing而不仅仅是thingy.intThing)不会。如果其地址没有存储在其他地方,则会被泄露。

+0

所以为了澄清,正确的代码是'delete thingy.intThing;删除thingy;'? – Clonkex

+0

@Clonkex:没错。或者使用像'std :: unique_ptr'这样的智能指针来完成它。 –

1
  1. 一个指针大小取决于机器和OS它在创建。
  2. 如果您有或没有分配任何东西给它,它将使用内存。
  3. 当删除具有指向*intThingy
+0

你的意思是“指向'* intThingy'”,对吧? 'intThingy'是一个指针,在这个问题中我没有看到任何双指针......“一个指向'intThingy'的指针在这里不存在 –

+0

@BenVoigt正确,修正。 – Caesar

0

指针本身是一个对象/变量这会占用空间的指针的对象(无论是在堆栈或堆)intThingy不会被删除,从而当不可不要与它所指的内容混淆。即使char *p = nullptr占用了sizeof(*p)字节的空间。

该标准保证机器中所有指针类型的大小都是相同的I.e. sizeof(char *)== sizeof(void *)== sizeof(int *)为true。它取决于编译器和目标机器的体系结构。

主机是您编译代码的地方,而目标机器是您打算运行代码的地方。这两个可以不同,在这种情况下,它被称为交叉编译。只有主机特性很重要(编译器也是如此)。说,如果宿主是64位,但你的编译器仅是32位,则该指针尺寸可以仅4个字节,而不是8

delete thingy;后指向的对象由thingy将被删除,但不thingy本身。但是thingy仍然会指向存在删除对象的内存。试图解引用它会导致未定义的行为(主要是崩溃)。因此删除后通常设置为NULL。然而另一个阵营认为将其设置为NULL是有风险的,因为不正确地尝试“重新删除”指针不会崩溃,因为它应该(删除NULL是无操作),从而隐藏了一个错误。

+0

有错字,可能是'sizeof(p)' – kotlomoy

+0

是的,我在编辑它。谢谢! – legends2k

0

指针是一种类似于C++中其他类型的类型。指针本身在内存中占用空间,只能指向创建该指针时指定的数据类型。

所以,即使你没有分配给它,指针也会占用内存空间。具体多少内存空间取决于它创建的机器。