c++-关于析构函数的问题:为什么将int* 赋值给含有int* 变量的class时会调用析构函数?

问题描述

关于析构函数的问题:为什么将int* 赋值给含有int* 变量的class时会调用析构函数?

下面的代码:
#include
using namespace std;

template
class MyContainer
{
public:
MyContainer(){ a = new T[n]; }
MyContainer(T* b) :MyContainer()
{
for (int i = 0; i < n; i++)
a[i] = b[i];
}
MyContainer(const MyContainer& b) :MyContainer()
{
for (int i = 0; i < n; i++)
a[i] = b.a[i];
}
void print()
{
for (int i = 0; i < n; i++)
cout << a[i] << "t";
}
//~MyContainer(){ cout << "destructor is running..."; delete[] a; }

private:
T* a;
};

int main()
{
int b[5] = { 1, 2, 3, 4, 5 };
MyContainer data;
data = b; //MyContainer tdata(b);data = tdata;
data.print();
cin.get();
return 0;
}

  1. 本来的目的是给MyContainer成员a赋值为{1,2,3,4,5},如果不使用自己定义的析构函数:
    ~MyContainer(){ cout << "destructor is running..."; delete[] a; }
    的话,运行正常,data.print会输出1 2 3 4 5;
    但是使用析构函数之后,程序就会显示:destructor is running...,然后输出5个很大的负数。为什么data=b这样的负值就会导致data调用析构函数?然后当我输入一个字符结束程序的时候,系统就会报错:Access violation reading location 0xFEEEFEEE,这又是为什么?
  2. 同样使用自己定义的析构函数的情况下,main函数第三行改为MyContainer tdata(b);data = tdata;之后,程序会输出1 2 3 4 5. 为什么像data=tdata这样的两个class之间的赋值就不会导致data调用析构函数?当我输入一个字符结束的时候,系统也会报错:
    Debug Assertion Failed!
    Expression:_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)
    这是什么错误,为什么会出现这个错误?

解决方案

....,,,,,,,,,,,,,

解决方案二:

你的问题不对吧,
虽然没搞过C++,但是析构函数要释放才会调用的

时间: 2024-09-24 01:28:06

c++-关于析构函数的问题:为什么将int* 赋值给含有int* 变量的class时会调用析构函数?的相关文章

warning C4150: 删除指向不完整“XXX”类型的指针;没有调用析构函数

  情况源于我的之前一片博客<C++ 智能指针>,在我写demo代码的时候.   向前申明了class Phone, 然后再U_ptr类析构函数中delete Phone的指针. 出现warning C4150: 删除指向不完整"XXX"类型的指针:没有调用析构函数     这个waring会导致内存泄露.前向申明的类的析构函数没有被调用     出现warning的代码如下:   #include <iostream> using namespace std;

关于c++显示调用析构函数的陷阱

一.文章来由 现在在写一个项目,需要用到多叉树存储结构,但是在某个时候,我需要销毁这棵树,这意味着如果我新建了一个树对象,我很可能在某处希望将这个对象的声明周期终结,自然会想到显示调用析构函数,但是就扯出来这么大个陷阱. 二.原因 在了解为什么不要轻易显示调用析构函数之前,先来看看预备知识. 为了理解这个问题,我们必须首先弄明白"堆"和"栈"的概念. 1)堆区(heap) -- 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收.注意它与数据结构中的堆

两次调用析构函数

在类生成临时对象时,遇到一个问题,程序会两次调用析构函数 #include <cstring> #include <iostream> using namespace std; class stack { public: stack(const char *value); ~stack(); char * data; }; stack::stack(const char *value) { if(value) { data = new char[strlen(value)+1];

c++-C++中指针声明时,int* p=0跟int *p=0哪个比较好?为什么?

问题描述 C++中指针声明时,int* p=0跟int *p=0哪个比较好?为什么? 新手学习C++时候,发现有些书写 int* p=0; 有些书写: int *p=0; 这两个有区别吗?区别在哪里?为什么会有两种写法? 还有下面的两种有区别吗?区别在哪里? int* const p=0; int const *p=0; 解决方案 第一个问题,这是定义一个int* p指针变量,(int p)<--->(int p) 这两种是等价,编译器会处理中间的空白符问题.第二个问题,int *const

全局的类为什么不会调用析构函数呢?

问题描述 全局的类为什么不会调用析构函数呢? 从图中c1c2是全局变量,最后的运行结果中并没有调用析构函数释放,这是为什么呢 解决方案 全局类会调用析构函数,但是你在控制台看不到输出,这是因为调用的时机,此时程序已经和控制台分离了.为了证明它的确被执行了,你可以下一个断点,调试执行,那么会看到程序确实停在了析构函数上. 解决方案二: 析构函数什么时候会调用?为什么会两次调用析构函数

c++-C语言中 int n = xx; 与 int n; n = xx; 这两种定义方式有什么不同?

问题描述 C语言中 int n = xx; 与 int n; n = xx; 这两种定义方式有什么不同? C语言中 int n = xx; 与 int n; n = xx; 这两种定义方式有什么不同? 解决方案 对于int等简单变量,建议给初始值,这不消耗cpu执行,又能确保程序正确,何乐不为? 解决方案二: 第一种是定义int变量同时赋予该变量初值 第二种是定义变量后,再赋初值 解决方案三: 应该是没有运行上的不同. 解决方案四: 比如 int n = xx; int a[n]; 与 int

移动开发-showDialog(int)这个函数内部是怎么实现对话框的调用

问题描述 showDialog(int)这个函数内部是怎么实现对话框的调用 showDialog(int)这个函数内部是怎么实现对话框的调用,生命周期或者是说运行顺序如何?先调用哪个方法,该方法的功能是什么?学移动端的朋友可以帮我解答一下吗?谢谢你们开发-showDialog(int)这个函数内部是怎么实现对话框的调用-dialog对话框"> 解决方案 http://www.cnblogs.com/-cyb/archive/2013/03/21/Android_showDialog.htm

求32位机器上unsigned int的最大值及int的最大值的解决方法_C 语言

复制代码 代码如下: #include <stdio.h>int main(int argc, char *argv[]){ unsigned int max_int = 0-1; printf("The max value of unsigned int on 32 machine: %u/n", max_int);} 复制代码 代码如下: #include <stdio.h>int main(int argc, char *argv[]){ unsigned

&lt;转&gt;零值比较--BOOL,int,float,指针变量与零值比较的if语句

零值比较--BOOL,int,float,指针变量与零值比较的if语句 这是程序员面试的一道常见题,也是个C++基础问题.若只在大学里看过几本基础的编程入门书,看见这道题可能会觉得奇怪,不就是和0比较吗,直接拿出来比就是了,其实非也.下文引自google搜索结果,出处不详,高手可以无视,菜菜留下,记得做好笔记.首先给个提示:题目中要求的是零值比较,而非与0进行比较,在C++里"零值"的范围可就大了,可以是0, 0.0 , FALSE或者"空指针".int型变量 n