热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

请教!临时对象析构失败

编一个C++程序的时候,遇到了如下问题,请指教#include<iostream>#include<string>usingnamespacestd
编一个C++程序的时候,遇到了如下问题,请指教

#include 
#include 

using namespace std;

class str  //这是一个简单的字符串类
{
char *p;
size_t len;
str(size_t l) { p=new char[(len=l)+1]; cout << (void *)p << " Allocated (size_t)\n"; }
public:
str() { p=new char[1]; p[len=0]=0; };
str(const char *src) { 
p=new char[(len=strlen(src))+1]; strcpy(p, src); 
cout << (void *)p << " Allocated (const char*)\n"; // 这些输出语句都是跟踪运行过程的
}
str(const str &src) {
p=new char[(len=src.len)]; 
strcpy(p, src.p); 
cout << (void *)p << " Allocated (const str&)\n"; 
}
str operator=(const str& src) 

delete[] p; 
p=new char[(len=src.len)]; 
strcpy(p, src.p); 
return *this; 
}
str operator+(const str& src) 

str ret(len+src.len); // [1]
strcpy(ret.p, p); strcpy(ret.p+len, src.p);
return ret; // [2]
}
~str() { 
cout << "Deallocating " << (void*)p << "...";
delete[] p;
cout << " Succeeded\n";

}
};

main()
{
str s("Ok");  //[3]
s+s; // [4]
cout << s.makestr() << endl;
}

执行结果:

00342490 Allocated (const char*)   //这是执行[3]时构造函数为字符指针分配的内存
003426D0 Allocated (size_t)        //这是执行[3]时构造函数为字符指针分配的内存
00342718 Allocated (const str&)    //这是执行[3]时构造函数(copy constructor)为指针分配的内存
Deallocating 003426D0... Succeeded //[1]处分配的内存在退出函数operator+时成功地被释放
Deallocating 00342718...           //[4]处产生的临时str对象的正在析构

然后就弹出一个错误对话框: 
Debug Error!
DAMAGE: after Normal Block(#??) at 0x????????

请问这是为什么?

9 个解决方案

#1


还有,我用的是vc.net编译器……

#2


s.makestr()???
表示疑惑

#3


抱歉,很多无关的内容都删除了,漏了那个,那一行也不要了

#4


别用托管C++,先用native的看看.
managed c++的内存分配与本地C++内存分配完全不同.

#5


我建立的是win32 console, 无mfc, 无atl, 也不存在托管问题。

#6


谁帮帮我,分析一下程序?谢了!

#7


这与返回方式有关,如果返回的是引用类型,就不会出现问题。
当返回一个object,实际上编译器作了手脚,将class重的每一个成员变量
push到stack,然后函数体中的局部对象就析构了。然后再main函数中
根据stack中的值重新构造一个对象.如果返回的对象中有指针,那么返回的
是一个指针的地址。指针指向的内容已经在局部对象中释放掉了。因此在
main函数中重新构造的临时对象的指针p指向的内容已经无意义了,删除必然
出错。
 看到出错的时候,construct 函数调用了3次,而析构函数却只调用了1次,
调用第二次的时候出现了错误,这个就是在main函数中的临时对象析构是出
现了问题

#8


说实在的,这个程序有很多问题,比如

str operator+(const str& src) 

str ret(len+src.len); // [1]
strcpy(ret.p, p); strcpy(ret.p+len, src.p);
return ret; // [2]
}

应是const str的返回值,我建议先看看effective c++

#9


感谢两位的建议。
<>才啃完一半不到,<>还要一段时日。我会尝试修改。

小刚的话我再回去好好琢磨一下

更正一下笔误:
00342490 Allocated (const char*)   //这是执行[3]时构造函数为字符指针分配的内存
003426D0 Allocated (size_t)        //这是执行[1]时构造函数为字符指针分配的内存
00342718 Allocated (const str&)    //这是执行[2]时构造函数(copy constructor)为指针分配的内存

推荐阅读
  • 本题要求在一组数中反复取出两个数相加,并将结果放回数组中,最终求出最小的总加法代价。这是一个经典的哈夫曼编码问题,利用贪心算法可以有效地解决。 ... [详细]
  • JavaScript中的数组是数据集合的核心结构之一,内置了多种实用的方法。掌握这些方法不仅能提高开发效率,还能显著提升代码的质量和可读性。本文将详细介绍数组的创建方式及常见操作方法。 ... [详细]
  • 主调|大侠_重温C++ ... [详细]
  • HDU 2871 内存管理问题(线段树优化)
    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2871。本题涉及内存管理操作,包括重置、申请、释放和查询内存块。通过使用线段树进行高效管理和维护。 ... [详细]
  • 本文深入探讨了UNIX/Linux系统中的进程间通信(IPC)机制,包括消息传递、同步和共享内存等。详细介绍了管道(Pipe)、有名管道(FIFO)、Posix和System V消息队列、互斥锁与条件变量、读写锁、信号量以及共享内存的使用方法和应用场景。 ... [详细]
  • KMP算法是处理字符串匹配的一种高效算法它首先用O(m)的时间对模板进行预处理,然后用O(n)的时间完成匹配。从渐进的意义上说,这样时间复 ... [详细]
  • This post discusses an issue encountered while using the @name annotation in documentation generation, specifically regarding nested class processing and unexpected output. ... [详细]
  • 本文介绍了如何使用暴力方法解决HDU5444问题。代码通过逐个检查输入数据,确保在所有情况下都能找到正确的解决方案。 ... [详细]
  • 二叉树的链表实现
    本文介绍了一种使用链表结构表示二叉树的方法。通过定义节点结构和相关操作函数,可以方便地创建、插入和遍历二叉树。 ... [详细]
  • Linux环境下进程间通信:深入解析信号机制
    本文详细探讨了Linux系统中信号的生命周期,从信号生成到处理函数执行完毕的全过程,并介绍了信号编程中的注意事项和常见应用实例。通过分析信号在进程中的注册、注销及处理过程,帮助读者理解如何高效利用信号进行进程间通信。 ... [详细]
  • 本文探讨了符号三角形问题,该问题涉及由相同数量的“+”和“-”符号组成的三角形。通过递归回溯法,可以有效地搜索并计算符合条件的符号三角形的数量。 ... [详细]
  • 本文将继续探讨前端开发中常见的算法问题,重点介绍如何将多维数组转换为一维数组以及验证字符串中的括号是否成对出现。通过多种实现方法的解析,帮助开发者更好地理解和掌握这些技巧。 ... [详细]
  • 本文探讨了C++编程中理解代码执行期间复杂度的挑战,特别是编译器在程序运行时生成额外指令以确保对象构造、内存管理、类型转换及临时对象创建的安全性。 ... [详细]
  • 本文详细介绍了C语言中的基本数据类型,包括整型、浮点型、字符型及其各自的子类型,并探讨了这些类型在不同编译环境下的表现。 ... [详细]
  • 本文介绍了如何通过Java代码计算一个整数的位数,并展示了多个基础编程示例,包括求和、平均分计算、条件判断等。 ... [详细]
author-avatar
mobiledu2502894591
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有