如何按值传递 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++98c++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