将char*赋值给字符串变量后删除它

Deleting char* after assigning it to a string variable

本文关键字:变量 删除 字符串 char 赋值      更新时间:2023-10-16

我已经执行了下面的代码,它工作得很好。因为它是关于指针的,我只是想确定一下。虽然我确信将char*赋值给string会复制,即使我删除char*, string var也会保留值。

    #include <stdio.h>
    #include <string.h>
    #include <string>
    #include <iostream>
    int main()
    {
        std::string testStr = "whats up ...";
        int strlen = testStr.length();
        char* newCharP = new char[strlen+1];
        memset(newCharP,'',strlen+1);
        memcpy(newCharP,testStr.c_str(),strlen);

        std::cout << "  :11111111   :   " << newCharP << "n";
        std::string newStr = newCharP ;
        std::cout << "  2222222 : " << newStr << "n";
        delete[] newCharP;
        newCharP = NULL;
        std::cout << "  3333333 : " << newStr << "n";
    }

我只是改变一些代码在我的公司项目和char*在c++函数之间传递。char*指针已被复制到字符串中,但char*在函数末尾被删除。我找不到任何具体的原因。我只是删除了char*,一旦它被复制到字符串中。这有什么问题吗?

p。S:我已经在Codereview中问过这个问题了,但有人建议我把它移到SO。所以我把它标记为关闭,并在这里张贴问题。

不,因为std::string复制了您的char*的内容,所以当您不再需要它时,您可以自由删除它。

没有问题,只要newChar指向以空结束的字符串,并且本身不是空。

std::string具有允许从const char*隐式构造的构造函数。它复制由输入const char *表示的字符串,因此它在char*是一个以空结束的字符串的假设下工作,因为没有其他方法可以知道要将多少字符复制到字符串自己的数据存储中。此外,NULL指针在标准中是不允许的。

代码很好,如果您查看std::basic_string的构造函数,您将能够推断出std::string有两个有趣的构造函数:

(4) string(char const*,
           size_type count,
           Allocator const& alloc = Allocator() );
(5) string(char const* s,
           Allocator const& alloc = Allocator() );

两者都执行复制,第一个完全读取count字符,而第二个一直读取,直到遇到一个null字符。


话虽如此,我还是积极鼓励您而不是在这里使用动态分配。如果您想使用临时缓冲区,请考虑使用std::vector

#include <stdio.h>
#include <string.h>
#include <string>
#include <iostream>
int main()
{
    std::string testStr = "whats up ...";
    unsigned strlen = testStr.length();
    std::vector<char> buffer(strlen+1);
    memset(&buffer[0],'',strlen+1);
    memcpy(&buffer[0], testStr.c_str(), strlen);
    std::cout << "  :11111111   :   " << &buffer[0] << "n";
    std::string newStr(&buffer[0]);
    std::cout << "  2222222 : " << newStr << "n";
    buffer.clear();
    std::cout << "  3333333 : " << newStr << "n";
}

注意:vectorstring都有范围构造函数,从一系列迭代器构建它们,我故意避免使用,以避免混淆和您不知所措。只要知道您可以使用它们来避免调用memcpy并冒缓冲区溢出的风险。