【问题标题】:convert char pointer with known length to vector of char without allocate new memory将已知长度的 char 指针转换为 char 向量而不分配新内存
【发布时间】: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;
}

但这不起作用输出是:

测试值
测试

但如果他们在同一内存上工作,那一定是:

测试
测试

有什么办法吗?

【问题讨论】:

  • vectors 复制您提供给他们的任何内容,vector 的全部意义在于管理其内容的生命周期,如果您不需要,请不要使用。

标签: c++ pointers vector


【解决方案1】:

但是如果他们在同一个内存上工作

答案是,它们不能在相同的内存上工作。当你构造一个向量时,它会为自己分配空间并复制内容。

因此,您得到的行为是正确且符合预期的。

要实现您想要的,请为向量编写自定义内存分配器。

【讨论】:

    【解决方案2】:

    正如其他人指出的那样,这是无法做到的。每个新的vector 都会为自己分配内存并将字符串复制进去。没有办法解决这个问题。

    如果您确定让vector&lt;char&gt;const char * 指向同一位置,则必须先创建vector&lt;char&gt;。但这是一个奇怪问题的奇怪解决方案。

    无论如何,这是 C++,所以无论如何你都不应该经常使用vector&lt;char&gt;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 始终使用其默认分配器在堆中创建一个位置。

        如果你需要实现这一点,你必须为向量编写一个自定义分配器,并为你的局部变量使用类似的内存分配策略。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-01-10
          • 1970-01-01
          • 1970-01-01
          • 2021-12-16
          • 1970-01-01
          • 1970-01-01
          • 2011-11-26
          • 2020-03-04
          相关资源
          最近更新 更多