0
    # 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 的内存损坏消息。我正在尝试通过将其分解为更小的部分来复制更高级别的问题,任何帮助将不胜感激。

4

2 回答 2

0

粗略一看,您正在将一个静态 char 数组传递给无法删除的 AssignChar(即,当您在代码中键入“A”时,它是编译器为您分配的特殊内存块)。

您需要了解 char* 的分配(或任何类型的指针)。当您调用时,n=c您只是在分配指针,指针指向的内存仍保留在原处。所以,除非这正是你想要做的,否则你将有 2 个指针指向同一个内存块。你需要决定删除哪个(你不能删除它两次,那会很糟糕)。

我的建议是开始使用 C++,所以不要再使用 char* 类型,而是使用 std::string。使用 char* 是 C 编程。请注意,如果您确实使用了 std::string 并将一个传递给assignChars,它将按照您的预期进行复制(并且无需在析构函数中释放 std::string 对象,它们会为您处理所有这些)。

于 2013-10-09T13:20:40.807 回答
0

当您尝试删除pC.

~c()析构函数调用~b()析构函数时 - 你正在尝试delete n;.

问题是 after assignchar(),n指向作为参数 ( ) 提供给它的字符串文字"a"

该字符串不是动态分配的,也不应该被释放,这意味着您应该删除“删除 n;” 行,或将动态分配的字符串assignchar()作为参数。

于 2013-10-09T13:17:21.340 回答