这是我写的代码,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());
...
当我运行时,我收到错误
当你看到“113”的析构函数 - 它是来自main函数的字符串 - 被调用两次。总共有3个构造函数调用和4个析构函数,我该如何解决这个问题?
答案 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);
}