C++ C++;删除语句isn';t执行我认为应该执行的操作--返回一个错误

C++ C++;删除语句isn';t执行我认为应该执行的操作--返回一个错误,c++,C++,我正在看下面的代码段。它编译得很好,但在包含delete语句时返回错误。错误是未分配要释放的指针。我错过了什么?我对堆栈溢出站点的搜索没有发现一个与此问题完全相同的问题。指向“副本”的链接在我看来不像是副本 代码是 long val2 = 72; long *pval2 = NULL; pval2 = new long; pval2 = &val2; std::cout << "pval2 = " << *pval2 << "\n"; //print

我正在看下面的代码段。它编译得很好,但在包含delete语句时返回错误。错误是未分配要释放的指针。我错过了什么?我对堆栈溢出站点的搜索没有发现一个与此问题完全相同的问题。指向“副本”的链接在我看来不像是副本

代码是

long val2 = 72;
long *pval2 = NULL;
pval2 = new long;
pval2 = &val2;
std::cout << "pval2 = " << *pval2 << "\n";  //prints the correct value
delete pval2; 
long val2=72;
long*pval2=NULL;
pval2=新长链;
pval2=&val2;
标准::cout
这为您提供了一些可供使用的内存空间

pval2 = &val2;
然后,这会立即丢弃该内存空间,并使指针指向
val2
(不是
可用内存)的位置。如果要将val2的值复制到新的内存地址中,则需要取消对指针的引用:

*pval2 = val2;

您正在尝试删除堆栈上的某些内容


此行
pval2=&val2指向堆栈上的某个对象。

pval2=new long
分配一个long并将其地址存储在
pval2

pval2=&val2
然后用另一个地址覆盖该地址,即
val2
的位置。在这一点上,您已经丢失了分配的长文件的地址


因此,当您最终开始
删除pval2它试图取消分配一些您一开始从未分配给new的内容,从而导致问题。

您只能给它删除new返回的内存地址&val2是堆栈上的地址,将其发送到delete是一个错误


最后,一旦您使用&val2覆盖pval2,您将丢失以前在堆上分配的内存地址,因此这是一个内存泄漏…

在分配pval2指向堆中的某个位置之后。然后将该点覆盖到堆栈中的某个位置。现在你在堆上找不到的地方了,那是你的错误

因为<代码> Val2< /C>没有被<代码>新< /C> >分配,它的地址,<代码>和Val2 < /C>不能传递给<代码>删除>代码>。你不能自由分配地址。读一些关于C++编程的好书。阅读和;在上面显示的有用注释之后使用,我的工作代码如下:
*pval2 = val2;