C++ 将char*赋值给字符串变量后删除它
我已经执行了下面的代码,它工作得很好。因为它是关于指针的,我只是想确定一下。虽然我确信将char*赋值给string会产生一个副本,即使我删除char*,string var也会保留该值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
#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!我知道你的痛苦,我自己也不得不处理一些令人沮丧的应用程序:(在这种情况下,你正朝着正确的方向努力,试图限制“感染”调整你必须处理的代码,使其变得更好!