执行我的代码时内存损坏

时间:2013-10-09 12:38:52

标签: visual-c++

    # 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收到内存损坏消息。我试图通过将问题分解成更小的位来复制更高级别的问题,任何帮助都将受到赞赏。

2 个答案:

答案 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对象,它们会处理所有这些你)。