我有以下问题。
如果
int a = 5;
和
int *b = new int(a);
然后我做
delete b;
如果我没弄错的话,它会删除b
所指向的对象。我不明白的是b
会发生什么?
b
是否仍然是指向new
过去生成的对象所在地址的指针?
答案 0 :(得分:3)
然后我删除b;它将删除b指向的对象
它将删除b
指向yes的对象,但该对象与对象a
无关(除了它们都具有相同的值)。
我不明白b会发生什么? b是否仍然是一个指针,指向新用户生成的对象所在的地址。
这正是b
发生的事情,即没有任何反应。 delete
仅影响动态内存管理和指向对象(调用其析构函数)。指针变量值本身不会被更改,但之后是一个悬空指针。
答案 1 :(得分:1)
是的,b仍然是一个有效的指针 - 它只是指向它的地址变为无效。声明
int c;
将为变量b(尽管是单位化的)保留存储,其方式与
相同text = ['a for=apple','b for=ball', 'd for=dog', 'e for=elephant', 'a for=apple', 'd for=dog', '1.=one', '2.=two']
left_sides = [pair.split('=')[0].replace('.','') for pair in text]
uniques = set(left_sides)
counts = {i:left_sides.count(i) for i in uniques}
print(counts)
保留用于存储整数的空间。 但是,你的b从不指向a的地址 - 这不是新的int(a)所做的。你的b是指向包含a。
值副本的地址的指针答案 2 :(得分:0)
你的理解是完全错误的。首先,删除b;将调用类型为e的析构函数(在类似int的基本类型的情况下为no-op)然后它会崩溃,因为将尝试在b处释放对象,但因为这是一个具有自动存储的对象持续时间尝试将以一种主要方式失败。
此外,b的初始化需要是" int * b =& a;",尝试将int赋给int *将产生编译时错误。
答案 3 :(得分:0)
当您通过指针删除对象时,会发生两件事:
致电delete b
后,您可以重复使用b
指向其他对象,例如
b = new int(123);
或者像这样
int a(123);
b = &a; // Obviously, you can't delete b after this
或者您可以将其设置为nullptr
,就像这样
b = nullptr;
但你不能取消引用指针,因为它会导致未定义的行为。
b是否仍然是一个指针,指向新用户生成的对象所在的地址?
通常,这正是发生的事情 - b
的价值保持不变。但是,没有符合标准的方法可以找到,因为C ++实现可以自由地以它喜欢的方式设置它。例如,指针可以设置为陷阱表示,因此仅打印指针的值会导致崩溃。
答案 4 :(得分:0)
您无法删除未由新分配的内存。 您不能将任何未使用new初始化的指针应用于delete。 删除b会显示未定义的行为,因为未使用新表达式获取b的值。
谢谢, Raghava