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

时间:2015-08-25 17:23:05

标签: 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-Strings如何删除工作。我发现删除实际上并没有删除已分配的内存,它只是告诉它不再需要它,所以我们在取消引用已删除的指针后会得到未定义的行为。 这是这种情况吗? “t”是否被隐含地取消引用? 根据我的理解,“t”本身指向c-string的起始地址(那么为什么在我打印t时打印值,如果不是因为它被隐式取消引用?)。 当我删除它后打印t时,它会给我与删除之前相同的数据。这是由未定义的行为引起的(因为t的隐式解除引用)还是有其他原因?

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

感谢您的帮助,

Grougal。

1 个答案:

答案 0 :(得分:3)

 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
 <%@page contentType="text/html" pageEncoding="UTF-8"%>
 <% int x = 1;%>
 <c:out value="${x}" />

这与t = "Blu"; cout << t << endl; const char *x = t; delete [] t; 相同,显然不对。您只能delete [] "blu"; delete[]