C 字符串和删除 - 它们究竟是如何工作的?

C-Strings and delete - how exactly do they work?

美好的一天,

const char *  t = new char[4];
const char *  t2 = "Blo";
t = "Blu";
cout << t << endl;
const char *x = t;
delete [] t;
cout << t << endl;
t2 = "Ble";
cout << t2<< endl;

我目前正在测试指针和 C 字符串以及删除的工作方式。我发现 delete 实际上并没有删除分配的内存,它只是告诉它不再需要它了,所以在取消引用已删除的指针时我们会得到未定义的行为。 这里是这样吗? "t" 是否被隐式取消引用? 根据我的理解,"t" 本身指向 c 字符串的起始地址(那么为什么我打印 t 时打印的值不是因为它被隐式取消引用了?)。 当我在删除它后打印 t 时,它会给我删除它之前的相同数据。这是由未定义的行为引起的(因为 t 的隐式取消引用)还是有其他原因?

另外,我是否也需要删除 t2?我以不同的方式写了它们;只是语法不同,它们的意思或多或少是相同的(除了末尾的 0 字节)还是那些非常不同? 如果我要删除的东西是用 new 创建的,我是否需要 delete only 还是 t2 也需要它? x 是 t 的副本吗?它的值在我删除 t 后是否存在(或者更确切地说,未定义的行为)还是指向 t 的指针? 由于所有这些标志都有多重含义,我有点困惑。

感谢您的帮助,

格鲁加尔。

t = "Blu";
cout << t << endl;
const char *x = t;
delete [] t;

这和delete [] "blu";一样,显然是不对的。你只能 delete[]new[].