使用新的[]创建C++中自定义类型的动态数组

使用新的[]创建C++中自定义类型的动态数组,c++,arrays,dynamic,types,C++,Arrays,Dynamic,Types,对于自定义类型的动态数组,有什么特别需要注意的吗 我试图在下面创建条件参数定义的动态数组 ConditionParameter* m_params; ... m_params = new ConditionParameter[m_numParams]; 但上面这一行的结果只是ConditionParameter类型的一个新对象,其地址存储在m_params中 struct ConditionParameter { ConditionParameter() : type(OBJ_

对于自定义类型的动态数组,有什么特别需要注意的吗

我试图在下面创建条件参数定义的动态数组

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;
};
当然,它是新的,返回指向分配内存块的第一个元素的指针。这就是为什么要将new的结果赋给ConditionParameter*类型的变量,该变量实际上是指向ConditionParameter的指针。但是,这并不意味着分配了单个对象。除非new返回null,否则它将按照您告诉它的数量分配对象

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

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;
};
否,结果是ConditionParameter的m_numParams实例化-指向第一个实例的指针由new返回

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

ConditionParameter* secondParam = &m_params[1];
您可以通过以下几点向自己证明这一点:


只有一个新对象-不正确。您可以通过在构造函数中打印一些内容来验证这一点。@albizgil,调试器不知道m_参数是如何创建的。他只知道它是一个ConditionParameter*,并且只会将其解释为ConditionParameter*。请改用std::vector!我不能准确地回忆起,但我相信您可以通过在watch/var窗口中使用变量len语法来指定要扩展的块分配序列的数组计数。即,输入m_params,N,其中N是您分配的元素数。我可能在语法上弄错了,但我知道有这个功能。@WhozCraig:你是对的,请参阅Visual Studio。是的,但它不应该创建m_numParams对象吗?它只创建一个对象。它创建所需数量的对象,但返回指向其中第一个对象的指针。@albizgil您怎么认为它只创建了一个对象?