将char*赋值给字符串变量后删除它
Deleting char* after assigning it to a string variable
我已经执行了下面的代码,它工作得很好。因为它是关于指针的,我只是想确定一下。虽然我确信将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";
}
注意:vector
和string
都有范围构造函数,从一系列迭代器构建它们,我故意避免使用,以避免混淆和您不知所措。只要知道您可以使用它们来避免调用memcpy
并冒缓冲区溢出的风险。
- 将数组的地址分配给变量并删除
- 根据模板类型有条件地删除变量
- 我无法删除 wxApp 类的成员变量
- 使用 ostream 变量删除代码重复
- 如何一次删除"cmake -D"定义的所有变量?
- 如何删除作为C++联合的成员变量的字符串对象
- 从文件名变量中删除".txt"
- 如何删除可以是指针(模板)的变量?
- C :动态分配的变量未在clang中删除
- 从函数中删除动态内存分配,但无法访问变量
- 如果我不删除动态创建的变量会发生什么
- C :从双变量的分数部分中删除尾随零
- 您可以删除本地静态变量吗?
- 将删除运算符放置在何处以进行动态变量
- 在堆上创建的变量未在 C++ 中删除
- 删除父类时,方法局部静态变量会发生什么情况
- 为什么删除成员变量的复制构造函数不会阻止默认的复制构造函数
- 是否可以使用 lambda 初始化变量(删除复制 ctor 时)
- C++ 通过无序变量删除二叉搜索树
- 基于一个1变量删除文本文件中的特定行