C++ 使用新运算符重载字符串的深度复制
我只是尝试执行字符串的deepcopy,但问题是当显示复制到另一个指针的字符串时,并没有显示C++ 使用新运算符重载字符串的深度复制,c++,C++,我只是尝试执行字符串的deepcopy,但问题是当显示复制到另一个指针的字符串时,并没有显示 #include<iostream> #include<stdio.h> #include<stdlib.h> #include<cstring> using namespace std; void *operator new(size_t size) { void *ptr = malloc(size);
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<cstring>
using namespace std;
void *operator new(size_t size)
{
void *ptr = malloc(size);
cout << "\n\ninside new operator" << endl;
return ptr;
}
void operator delete(void *ptr)
{
free(ptr);
cout << "\n\ninside delete operator" << endl;
}
int main()
{
char *str = "hello world";
char *shallowCopy = str;
char *deepcopy = new char[(strlen(str) + 1)];
while (*str != '\0')
{
*deepcopy = *str;
deepcopy++;
str++;
}
*deepcopy = '\0';
cout << "\n\n shallow string is :-" << shallowCopy << endl;
cout << "\n\n deep string is :-" << deepcopy << endl;
delete str;
delete shallowCopy;
delete deepcopy;
getchar();
}
#包括
#包括
#包括
#包括
使用名称空间std;
void*运算符新(大小\u t大小)
{
void*ptr=malloc(尺寸);
cout(顺便说一下,您需要用括号重载new
操作符)
您需要将deepcopy
设置回字符串的开头:在cout
处,它指向NUL终止符
无论如何,您都需要原始指针,以便执行对delete[]
的适当调用
请注意,您最近的编辑在您的程序中引入了大量未定义的行为。您只需在调用new[]
返回的指针上调用delete[]
,您的主要功能如下所示
int main()
{
char *str = "hello world";
char *shallowCopy = str;
char *deepcopy = new char[(strlen(str) + 1)];
while (*str != '\0')
{
*deepcopy = *str;
deepcopy++;
str++;
}
*deepcopy = '\0';
cout << "\n\n shallow string is :-" << shallowCopy << endl;
cout << "\n\n deep string is :-" << deepcopy - strlen(shallowCopy) << endl; /* here*/
}
intmain()
{
char*str=“你好,世界”;
char*shallowCopy=str;
char*deepcopy=newchar[(strlen(str)+1)];
而(*str!='\0')
{
*deepcopy=*str;
deepcopy++;
str++;
}
*deepcopy='\0';
对于初学者来说,应该使用C++标头,如
#include<cstdio>
#include<cstdlib>
导致程序的行为未定义
在这个循环中
while (*str != '\0')
{
*deepcopy = *str;
deepcopy++;
str++;
}
指针str
和deepcopy
的原始值发生了更改。因此,此语句再次出现
delete deepcopy;
导致程序的行为未定义
要将一个字符串复制到另一个字符串,您应该使用额外的指针或索引变量,例如
for ( size_t i = 0; ( deepcopy[i] = str[i] ) != '\0'; i++ )
{
// empty body
}
请注意,char*str=“hello world”
不应编译。“hello world”
是一个常量字符[N]< /代码>使用非const指针,它违反了const正确性。问题不是使用代码> STD::String < /C>。下面请回答:现在我可以投票否决这个问题吗?@ USER 57 94230不仅在C++中使用<代码>新< /代码>可能是最坏的实践,重载<代码>新< /COD>操作符>(这根本不会有任何影响)似乎更糟。使用<代码> STD::String 正确地管理这些事情。你有一个难得的机会,你比C++标准委员会更聪明。如果你不想使用任何内置函数,那么你不应该使用<代码> Malc C < /C>和<代码> Fuff< /Cult>。给了我一个“希比”,但它不是错误的,是的,它是一种脏东西,但是我猜想作者只是想练习C++,而不是用于生产。是的,我只是尝试通过执行一个新的操作符重载来拷贝一个字符串到另一个字符串。重载部分是好的。但是现在你的指针不再指向C的开始号了。opied字符串(因为你用++移动了它)是的..谢谢我得到了它…你能解释一下“deepcopy回到字符串的开头:在cout它指向NUL终止符。”通过提供一些示例代码..这将是一个很好的帮助哦,你认为deepcopy++
有什么作用?!它移动到下一个元素地址或类似于*deepcopy++=*str++确实是,但是如果你没有保留deepcopy
的原始值,你将如何打印字符串?这就是你在这里遇到的问题。是的..pri字符串的使用是一个问题,我发现在每次迭代之后,值都被分配了很多,需要逐行解释……这真的很有帮助
delete deepcopy;
for ( size_t i = 0; ( deepcopy[i] = str[i] ) != '\0'; i++ )
{
// empty body
}