将已知长度的 char 指针转换为 char 向量而不分配新内存
Posted
技术标签:
【中文标题】将已知长度的 char 指针转换为 char 向量而不分配新内存【英文标题】:convert char pointer with known length to vector of char without allocate new memory 【发布时间】:2015-06-29 09:10:56 【问题描述】:我尝试从给定的 char 指针创建一个std::vector,而不分配新内存。这样他们就可以在同一个内存上工作。
我试过这个:
int main()
char* test1 = "test value";
std::vector<char> testVector(test1, test1 + strlen(test1));
testVector[4] = 0;
std::cout << test1 << std::endl;
std::cout << &(testVector[0]) << std::endl;
但这不起作用输出是:
测试值 测试
但如果他们在同一内存上工作,那一定是:
测试 测试
有什么办法吗?
【问题讨论】:
vector
s 复制您提供给他们的任何内容,vector
的全部意义在于管理其内容的生命周期,如果您不需要,请不要使用。
【参考方案1】:
但是如果他们在同一个内存上工作
答案是,它们不能在相同的内存上工作。当你构造一个向量时,它会为自己分配空间并复制内容。
因此,您得到的行为是正确且符合预期的。
要实现您想要的,请为向量编写自定义内存分配器。
【讨论】:
【参考方案2】:正如其他人指出的那样,这是无法做到的。每个新的vector
都会为自己分配内存并将字符串复制进去。没有办法解决这个问题。
如果您确定让vector<char>
和const char *
指向同一位置,则必须先创建vector<char>
。但这是一个奇怪问题的奇怪解决方案。
无论如何,这是 C++,所以无论如何你都不应该经常使用vector<char>
或char *
。只需使用std:: string
。
#include <string>
int main()
std:: string test_string = "test value";
test_string.at(4) = '-';
std::cout << test_string << std::endl;
并且很容易向string
询问其底层 (const
) C 数组,例如,如果您有旧的 C 代码,则必须与之交互。 const char * char_pointner = test_string.c_str()
.
【讨论】:
【参考方案3】:当你声明一个向量时,它总是分配一个新数组。
如果您像以前一样将数组作为参数,它将分配一个相同大小的新数组并从源复制内容。
std::vector
无法做到这一点。如果你想在同一个数组上使用不同的指针,你必须使用原生数组:
char test1[] = "test value";
char* testPtr = test1;
testPtr[4] = 0;
std::cout << test1 << std::endl; // Print "test".
std::cout << testVector << std::endl; // Print "test" as well.
顺便说一句,如您所见,您应该使用char []
语法而不是char *
声明您的第一个数组,否则您的变量将是只读的,您将无法对其进行编辑。
注意:
即使它有效,这更像是一种 C tan C++ 实践。考虑了解std::string 对象以进行字符操作。
【讨论】:
【参考方案4】:目前您的 char 指针 test1 将其内存保留在堆栈中,但 vector 始终使用其默认分配器在堆中创建一个位置。
如果你需要实现这一点,你必须为向量编写一个自定义分配器,并为你的局部变量使用类似的内存分配策略。
【讨论】:
以上是关于将已知长度的 char 指针转换为 char 向量而不分配新内存的主要内容,如果未能解决你的问题,请参考以下文章
无法将字符串转换为 const char/string* 到 int*