【问题标题】:Using new [] to create a dynamic array of custom a type in C++在 C++ 中使用 new [] 创建自定义类型的动态数组
【发布时间】:2013-11-10 12:43:31
【问题描述】:

自定义类型的动态数组有什么特别需要注意的地方吗?

我正在尝试创建一个 ConditionParameter 的动态数组(定义如下)

ConditionParameter* m_params;
...
m_params = new ConditionParameter[m_numParams];

但是上面一行的结果只是一个ConditionParameter类型的新对象,其地址存储在m_params中。

struct ConditionParameter
{
    ConditionParameter() :
    type(OBJ_TYPE_OBJECT),
    semantic(OP_SEMANTIC_TYPE_NONE),
    instance(NULL),
    attrib(ATTRIB_TYPE_NONE),
    value(0)
    {}

    ConditionParameter(const ConditionParameter& other)
    {
        attrib = other.attrib;
        instance = other.instance;
        semantic = other.semantic;
        type = other.type;
        value = other.value;
    }

    ConditionParameter& operator = (ConditionParameter& other)
    {
        attrib = other.attrib;
        instance = other.instance;
        semantic = other.semantic;
        type = other.type;
        value = other.value;
        return *this;
    }

    ObjectType          type;   

    OperandSemanticType semantic;
    Object*             instance;
    AttributeType       attrib;
    int                 value;
};

【问题讨论】:

  • “只是一个新对象” - 不正确。您可以通过在构造函数中打印一些内容来验证这一点。
  • @albizgil,调试器不知道 m_params 是如何创建的。他只知道这是一个 ConditionParamter* 并且只会将其解释为这样。
  • 改用std::vector
  • 我无法正确回忆,但我相信您可以通过在 watch/var 窗口中使用 variable,len 语法来指定数组计数以扩展像这样的块分配序列. IE。输入m_params, N,其中N 是您分配的元素数。我可能在语法上错了,但我知道这个功能就在那里。
  • @WhozCraig:你是对的,请参阅 related question for Visual Studio。

标签: c++ arrays dynamic types


【解决方案1】:

但是上面一行的结果只是一个新的类型对象 ConditionParameter,其地址存储在m_params中。

不,结果是ConditionParameterm_numParams 实例化——new 返回的指向 first 的指针。

new[] 创建一个由ConditionParameter 对象组成的连续数组。第一个位于m_params。您可以使用[] 运算符进行后续实例化,如下所示:

ConditionParameter* secondParam = &m_params[1];

您可以用一点“sprintf debugging”向自己证明这一点:

ConditionParameter() :
    type(OBJ_TYPE_OBJECT),
    semantic(OP_SEMANTIC_TYPE_NONE),
    instance(NULL),
    attrib(ATTRIB_TYPE_NONE),
    value(0)
    {
      cout << "Constructor\n";
    }

【讨论】:

    【解决方案2】:

    当然是new返回一个指向已分配内存块的第一个元素的指针。这就是为什么你将 new 的结果分配给ConditionParameter* 类型的变量,它实际上是指向ConditionParameter 的指针。然而,这并不意味着已经分配了单个对象。除非 new 返回 null ,否则它将分配您告诉它的尽可能多的对象。

    【讨论】:

    • 是的,但它不应该创建 m_numParams 对象吗?它只创建一个对象。
    • 它创建请求数量的对象,但返回指向第一个对象的指针。
    • @albizgil 是什么让你认为它只创建了一个对象?
    猜你喜欢
    • 1970-01-01
    • 2011-06-09
    • 2011-10-09
    • 1970-01-01
    • 1970-01-01
    • 2020-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多