# include "stdafx.h"
# include <iostream>
#include <ctype.h>
using namespace std;
class a
{
protected:
int d;
public:
virtual void assign(int A) = 0;
int get();
};
class b : a
{
char* n;
public:
b()
{
n=NULL;
}
virtual ~b()
{
delete n;
}
void assign(int A)
{
d=A;
}
void assignchar(char *c)
{
n=c;
}
int get()
{
return d;
}
char* getchart()
{
return n;
}
};
class c : b
{
b *pB;
int e;
public:
c()
{
pB=new b();
}
~c()
{
delete pB;
}
void assign(int A)
{
e=A;
pB->assign(A);
}
int get()
{
return e;
}
b* getp()
{
return pB;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
c *pC=new c();
pC->assign(10);
b *p=pC->getp();
p->assignchar("a");
char *abc=p->getchart();
delete pC;
cout<<*abc<<endl;
getchar();
}
我是c ++的菜鸟,当我到达这一点时正在尝试。我不明白为什么我不断从VS2010收到内存损坏消息。我试图通过将问题分解成更小的位来复制更高级别的问题,任何帮助都将受到赞赏。
答案 0 :(得分:0)
当您尝试删除pC
时会出现问题。
当~c()
析构函数调用~b()
析构函数时 - 您正尝试delete n;
。
问题是在assignchar()
之后,n
指向作为参数("a"
)赋予它的字符串文字。
该字符串不是动态分配的,不应该被释放,这意味着您应该删除'delete n;' line,或将动态分配的字符串作为参数提供给assignchar()
。
答案 1 :(得分:0)
从粗略的一瞥中,您将一个静态字符数组传递给AssignChar,该数组无法删除(即当您在代码中键入“A”时,它是编译器为您分配的特殊内存块)。
您需要了解char *的分配(或任何指向类型的指针)。当您调用n=c
时,您只是指定指针,指针指向的内存将保留在原位。所以,除非这正是你想要做的,否则你将有两个指向同一块内存的指针..你需要决定删除哪一个(你不能删除它两次,那就不好了)。
我的建议是开始使用C ++,所以不再使用char *类型,而是使用std :: string。使用char *是C编程。请注意,如果您确实使用了std :: string,并将其传递给assignChars
,它将按预期复制(并且不需要在析构函数中释放std :: string对象,它们会处理所有这些你)。