C++ 按需创建

标签 c++

我正在阅读一本书,其中出现了以下代码。

TTextInBuffer::TTextInBuffer(const char *pInputFileName, TAbortCode ac)
: pFileName(new char[strlen(pInputFileName) + 1])

pFileName 声明为 const char,因此我假设第二行在 pFileName 中创建了一个新的 char。我只想知道正在发生的事情的细节。谢谢。

最佳答案

当调用此构造函数时,将执行此处的初始化列表:

: pFileName(new char[strlen(pInputFileName) + 1])

strlen() 调用根据其内容查找 pInputFileName 字符串的长度。它基本上将它作为一个 char 数组遍历,直到找到 NULL,然后返回结果。这样做是为了计算 pFileName 中新字符串所需的空间。

+ 1 用于确保末尾有额外的 NULL 终止符。

最后,无论从该表达式中弹出什么数字,都会使用关键字 new 送入内存分配调用。这会在字符串数据最终所在的堆上动态分配内存。 new 调用返回已分配内存的地址,并将其传递给 pFileName 指针变量,以便它指向它。

总结一下:

  1. 计算pInputFileName的长度
  2. 计算的长度增加 1 以适应拷贝中的 NULL
  3. new 被调用为拷贝申请空间
  4. new 返回的地址赋值给pFileName

您的代码中缺少的一件事是将输入字符串的内容实际复制到目的地,但也许这发生在构造函数体内(在 { 之间) } 个字符)。

关于C++ 按需创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6165762/

相关文章:

c++ - 如何打印出 Visual Studio 跟踪点中的寄存器偏移量?

c++ - 为什么 C++ 流使用 char 而不是 unsigned char?

c++ - 转发模板自动

java - 如何使用 JNI 在 C++ 中返回 java 字符串

c++ - C 和 C++ 中前缀递增运算符的区别

c++ - 即使所有文件都使用 fPIC 编译,ld 也无法将静态库链接到动态库

c++ - Qt - 从主窗口显示第二个窗口

c++ - Eclipse C++ 包含错误 : no such file or directory

c++ - libuv - 如何保持默认循环运行直到程序中的至少一个线程处于事件状态?

c++ - 为什么 C++ 中的参数匹配会忽略数组大小?