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

标签 c++ pointers memory c-strings

你好,

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"; 一样,显然是不对的。您只能删除[]新建[]的内容。

关于c++ - C 字符串和删除 - 它们究竟是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32210320/

相关文章:

c++ - C++ 编译器如何优化堆栈分配?

c# - 固定缓存的哈希表大小

c++ - 在c++中找到两个 vector 中第一个公共(public)条目的位置的最快方法是什么?

c++ - 为什么 .so 文件总是小于 .a 文件?(来源相同。)

c++ - 为什么不能 p = itv?(来自 C++ 的 vector 问题)

javascript - 如何将指针列指向 Parse 中单独类中的特定对象?

c++ - C++中的内存分配

java - 安卓 : Need to create Shared Preferences object in c++ NDK and Store some Boolean value

c++ - 为什么此c++代码打印出长度为5,而当我打印出字符串时,程序会自动终止?

c - 使用它时是否可以在不使用 malloc 的情况下增加 char 数组?