【问题标题】:How to initialize c-strings array (no stl)如何初始化 c-strings 数组(无 stl)
【发布时间】:2011-09-02 19:39:16
【问题描述】:

我想在 MSVC2010 中用零指针初始化 c 字符串数组

// Foo.h
#pragma once
class Foo {
  int sz_;
  char **arr_; 
public:
  Foo();
  ~Foo();
  // ... some other functions
};

// Foo.cpp
#include "Foo.h"
#define INITIAL_SZ 20

Foo::Foo() : sz_(INITIAL_SZ) {
  // there I have to initialize arr_ (dynamic array and can be enlarged later)
  arr_ = (char **)calloc(INITIAL_SZ * sizeof (char *)); // ??? 
  // or maybe arr_ = new ...
}

如何正确初始化arr_?我不被允许使用 STL、MFC 等。

【问题讨论】:

  • 只是好奇。为什么没有 STL?到目前为止,您还尝试过什么?实际上,您所拥有的 calloc() 会将所有内容初始化为零(NULL)。
  • 如果不是 class 位,我会标记这个 C...
  • @yasouser - 这是客户的要求

标签: c++ arrays c++11 crt c-strings


【解决方案1】:

arr = new char*[INITIAL_SZ](); 可以 - 您甚至可以将其放入初始化列表中。

【讨论】:

    【解决方案2】:

    如果你真的想避免STL等,那何乐而不为:

    arr_ = new char*[INITIAL_SZ]();
    

    你甚至可以把它放在初始化列表中。

    记得在你的析构函数中调用delete [] arr_。 (正如@Nawaz 在下面指出的那样,您可能还应该遵循三法则,并定义一个合适的复制构造函数和赋值运算符。)

    【讨论】:

    • 我认为它不会将它们初始化为零,是吗? (我不太确定初始化规则,但我认为需要额外的括号)
    • 还定义了copy-ctor和赋值运算符:三规则!
    【解决方案3】:

    1.建立一个合适的字符串类

    2.构建一个合适的数组类

    3.在字符串上使用数组

    快乐地追逐内存泄漏、双重释放和内存损坏。

    【讨论】:

    • 是的,除非你没有回答他的问题。 “我不被允许使用 STL、MFC 等。”显然他遵循了一些具体的指导方针,所以你的回答完全没有帮助,如果不是有点自欺欺人的话。
    • @leetNightshade:它肯定被卡住了,并且意味着嘲讽。然而,不使用 STL 或 MFC 并不意味着您不能创建自己的内存管理类。我的回答只是建议分解问题(String + Array),而不是试图一次解决所有问题。而且我知道这些课程是不完美的,专家们弄错了。
    • +1 提前做一些额外的工作,以避免数小时痛苦的字符串管理和手动调试。
    【解决方案4】:
    arr_ = (char **)calloc(INITIAL_SZ * sizeof (char *));
    

    应该是

    arr_ = (char **)calloc(INITIAL_SZ, sizeof (char *));

    【讨论】:

      【解决方案5】:

      正确的方法是将arr_ 重新定义为std::vector<std::string> 并使用vector::reserve() 来提示您希望拥有的字符串数量。让 C++ 为您处理内存。

      但如果您必须使用原始 C 字符串,您可能需要:

      arr_ = new char *[sz_];
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-09-22
        • 1970-01-01
        • 2013-05-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-21
        相关资源
        最近更新 更多