如何按值传递 char* C++?
How to pass char* by value C++?
我已经定义了一个 char* content
类型的属性,它接受一个包含甚至 [=14=]
类字符的字符串,这样我就不能使用 string
类型了。
当我尝试为内容定义 setter 时出现的问题是:
void MyClass::setContent(char* content)
{
if(this->contentLength!=0){
if(this->content)
free(this->content);
this->content = (char*)malloc(this->contentLength);
memset(this->content,0,this->contentLength);
memcpy(this->content,content,this->contentLength);
}
}
知道contentLength
也是MyClass
的属性。
但是在另一个堆栈中,我定义了一个函数,该函数 MyClass
的 returns 对象如下:
MyClass myfunction(args) {
MyClass myclass;
/**
*Do some stuff on myclass
*/
return myclass;
}
在另一个堆栈上,我定义了这个:
MyClass element = myFunction(args);
这里我丢失了内容,因为它总是指向第一个堆栈中 myclass
的地址。
如何将 content
复制到新对象 element
?
我正在研究 C++98
,c++11
上的任何解决方案都无法实施。
见https://en.cppreference.com/w/cpp/language/copy_constructor
当您 return 按值创建对象时,将调用复制构造函数来复制您的对象。
如果您不手动创建一个,则会生成一个默认的复制构造函数。它只是复制指针,所以两个指针指向同一个数组。
您可以像这样手动创建一个复制构造函数:
MyClass(const MyClass& other)
{
this->contentLength = other.contentLength;
this->content = (char*) malloc(this->contentLength);
memcpy(this->content, other.content, this->contentLength);
// Copy every other field manually here, if you have any.
}
更新:
请参阅 eerorika 和 Peter 的回答,了解更好的做法以及如何避免这种需要。
I have defined an attribute of type char*
content that accepts a string that contains even [=12=]
like characters,
你的问题就在这里。如果您传递一个 char *
- 更糟糕的是,使用它来管理由 malloc()
返回的动态分配的内存,有很多事情可能会出错。
只需传递一个 std::vector<char>
即可。它跟踪自己的长度,不关心它包含多少 '[=16=]'
值,并且可以根据需要动态调整大小。例如,您可以重新实现
void MyClass::setContent(const std::vector<char> &content)
{
this->content = content; // this will copy all of the characters
// from content to this-content
// and manage memory for you
}
有很多关于 std::vector
的文档可用,例如 cppreference vector page 解释了 vector
支持的操作。只要您不厌其烦地适当使用它的操作(这不是免费的),std::vector<char>
会让您的生活更轻松。虽然 C++ 标准之间 std::vector
有一些演变,但即使是 C++98 版本也应该足以满足您的需求。
How to pass char* by value C++?
与其他类型按值传递的方式相同:不要使用引用参数。示例:
void function_name(char*); // the pointer will be passed by value
how can I copy the content
to the new object element?
你就是这么做的。您复制了指针,因此副本指向同一个数组。
如果你想进行深拷贝,那么你可以分配一个新数组,将新指针指向这个单独的分配,然后从旧数组中复制字符串。
但这不一定是您应该编写class的方式。您应该做的是根据用例使用 std::string
成员或 std::vector<char>
。
a string that contains even [=19=] like characters, in this way I could not use the string
type.
不清楚你的意思。如果您试图说 std::string
不能包含空终止符,那您就错了。
P.S。避免在 C++ 中使用 malloc
。
我已经定义了一个 char* content
类型的属性,它接受一个包含甚至 [=14=]
类字符的字符串,这样我就不能使用 string
类型了。
当我尝试为内容定义 setter 时出现的问题是:
void MyClass::setContent(char* content)
{
if(this->contentLength!=0){
if(this->content)
free(this->content);
this->content = (char*)malloc(this->contentLength);
memset(this->content,0,this->contentLength);
memcpy(this->content,content,this->contentLength);
}
}
知道contentLength
也是MyClass
的属性。
但是在另一个堆栈中,我定义了一个函数,该函数 MyClass
的 returns 对象如下:
MyClass myfunction(args) {
MyClass myclass;
/**
*Do some stuff on myclass
*/
return myclass;
}
在另一个堆栈上,我定义了这个:
MyClass element = myFunction(args);
这里我丢失了内容,因为它总是指向第一个堆栈中 myclass
的地址。
如何将 content
复制到新对象 element
?
我正在研究 C++98
,c++11
上的任何解决方案都无法实施。
见https://en.cppreference.com/w/cpp/language/copy_constructor 当您 return 按值创建对象时,将调用复制构造函数来复制您的对象。
如果您不手动创建一个,则会生成一个默认的复制构造函数。它只是复制指针,所以两个指针指向同一个数组。
您可以像这样手动创建一个复制构造函数:
MyClass(const MyClass& other)
{
this->contentLength = other.contentLength;
this->content = (char*) malloc(this->contentLength);
memcpy(this->content, other.content, this->contentLength);
// Copy every other field manually here, if you have any.
}
更新: 请参阅 eerorika 和 Peter 的回答,了解更好的做法以及如何避免这种需要。
I have defined an attribute of type
char*
content that accepts a string that contains even[=12=]
like characters,
你的问题就在这里。如果您传递一个 char *
- 更糟糕的是,使用它来管理由 malloc()
返回的动态分配的内存,有很多事情可能会出错。
只需传递一个 std::vector<char>
即可。它跟踪自己的长度,不关心它包含多少 '[=16=]'
值,并且可以根据需要动态调整大小。例如,您可以重新实现
void MyClass::setContent(const std::vector<char> &content)
{
this->content = content; // this will copy all of the characters
// from content to this-content
// and manage memory for you
}
有很多关于 std::vector
的文档可用,例如 cppreference vector page 解释了 vector
支持的操作。只要您不厌其烦地适当使用它的操作(这不是免费的),std::vector<char>
会让您的生活更轻松。虽然 C++ 标准之间 std::vector
有一些演变,但即使是 C++98 版本也应该足以满足您的需求。
How to pass char* by value C++?
与其他类型按值传递的方式相同:不要使用引用参数。示例:
void function_name(char*); // the pointer will be passed by value
how can I copy the
content
to the new object element?
你就是这么做的。您复制了指针,因此副本指向同一个数组。
如果你想进行深拷贝,那么你可以分配一个新数组,将新指针指向这个单独的分配,然后从旧数组中复制字符串。
但这不一定是您应该编写class的方式。您应该做的是根据用例使用 std::string
成员或 std::vector<char>
。
a string that contains even [=19=] like characters, in this way I could not use the
string
type.
不清楚你的意思。如果您试图说 std::string
不能包含空终止符,那您就错了。
P.S。避免在 C++ 中使用 malloc
。