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

C++ 将char*赋值给字符串变量后删除它,c++,string,pointers,char,C++,String,Pointers,Char,我已经执行了下面的代码,它工作得很好。因为它是关于指针的,我只是想确定一下。虽然我确信将char*赋值给string会产生一个副本,即使我删除char*,string var也会保留该值 #include <stdio.h> #include <string.h> #include <string> #include <iostream> int main() { std::stri

我已经执行了下面的代码,它工作得很好。因为它是关于指针的,我只是想确定一下。虽然我确信将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,'\0',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";
    }
#包括
#包括
#包括
#包括
int main()
{
std::string testStr=“怎么了…”;
int strlen=testStr.length();
char*newCharP=newchar[strlen+1];
memset(newCharP,'\0',strlen+1);
memcpy(newCharP,testStr.c_str(),strlen);

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

只要
newChar
指向以null结尾的字符串,并且本身不为null,就没有问题


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

代码很好,如果您查看
std::basic\u string
的构造函数,您可以推断
std::string
有两个有趣的构造函数:

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

(5) string(char const* s,
           Allocator const& alloc = Allocator() );
两者都执行一个复制,第一个读取精确的
计数
字符,而第二个读取直到遇到NUL字符


以上所说的,我积极鼓励你不要在这里使用动态分配。如果你想要临时缓冲区,请考虑使用<代码> STD::向量< /代码>。< /P>

#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],'\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";
}
#包括
#包括
#包括
#包括
int main()
{
std::string testStr=“怎么了…”;
unsigned strlen=testStr.length();
std::向量缓冲区(strlen+1);
memset(&buffer[0],'\0',strlen+1);
memcpy(&buffer[0],testStr.c_str(),strlen);

std::cout Thank Matt,实际上char*是从另一个函数传递过来的。就像我说的,我正在处理一些旧代码,我不能继续在所有函数调用中更改参数。我们的代码库相当大。这些char*的删除在函数的许多部分执行,每个部分在某些条件下只执行一次。我不喜欢这些代码重复,所以我只是简单地将char*复制到字符串,并删除了函数开头的char*。@ManikandarajS:Hum!我知道你的痛苦,我自己也不得不处理一些令人沮丧的应用程序:(在这种情况下,你正朝着正确的方向努力,试图限制“感染”调整你必须处理的代码,使其变得更好!