为什么析构函数在这里调用?

时间:2015-04-08 12:47:18

标签: c++

这是我写的代码,sm_string(如std :: string)类:

class sm_string
{
....
    void _Add(sm_string a)
    {// it adds the string to string(concatenates) and saves result in (*this)
        printf("\n_Add %s %s\n",str,a());
        str = (char*)ReallocSave(str,Len()+a.Len()+1,Len()+1);
        memcpy(str+Len(),a(),a.Len()+1);
    }
    sm_string Add(sm_string a)
    {// it concatenates too, return result,doesnt change (*this)
        printf("\nAdd %s %s\n",str,a());
        sm_string res(str);
        res._Add(a);
        return res;
    }


    sm_string(char* a)      
    {// creates string from char* string
        str = (char*)malloc(strlen(a)+1);
        memcpy(str,a,strlen(a)+1);
        printf("Creating %s\n",str);
    }
    sm_string(int a)        
    {// creates string from int
        char buf[100];
        itoa(a,buf,10);
        str = (char*)malloc(strlen(buf)+1);
        memcpy(str,buf,strlen(buf)+1);
        printf("Creating %s\n",str);
    }
    sm_string()     
    {//creates null string {'\0'}

        str = (char*)malloc(1);
        str[0] = '\0';
        printf("Creating %s\n",str);
    }
    ~sm_string()
    {//frees the pointer
        printf("\nFree of %s\n",str);
        free(str);
    }
.....
};

这是我的realloc函数(导致正常的realloc可能在分配更多内存时丢失内容)

void* ReallocSave(void* pointer,int size,int oldsize)
{//realloc, which doesnt loose the memory
    void* _instance = malloc(size);
    memcpy(_instance,pointer,min(size,oldsize));
    free(pointer);
    return _instance;
}

这是主要功能:

...
sm_string a("1");
a._Add(a.Add(3));
printf("%s",a());
...

当我运行时,我收到错误

http://i.stack.imgur.com/1IOCn.png

当你看到“113”的析构函数 - 它是来自main函数的字符串 - 被调用两次。总共有3个构造函数调用和4个析构函数,我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

只是一个猜测:

您的参数是字符串,不是引用或字符串指针而是字符串。基本上,当调用_Add时,会在堆栈上创建sm_string a的副本。

然后在a函数(原始对象的副本)和主函数_Add中的a变量a上调用析构函数两次。

void _Add(sm_string a) <= Try to change a with a pointer or a reference
{
    // it adds the string to string(concatenates) and saves result in (*this)
    printf("\n_Add %s %s\n",str,a());
    str = (char*)ReallocSave(str,Len()+a.Len()+1,Len()+1);
    memcpy(str+Len(),a(),a.Len()+1);
}