C++ C++;运算符new返回意外值

C++ C++;运算符new返回意外值,c++,C++,我正在使用转换运算符,突然出现了一个错误C类派生自B,与类A没有关系,但是,调试器显示,在执行C*val1=new C时,val1显示为C*{A}。它还产生了一个错误,因为C*指针中的A的大小不合理(每次执行时它都会给出不同的大小,所以我假设它从另一个应用程序获取一个数字) #包括 #包括 样板 甲级 { 公众: std::向量值; 虚拟~A(){} 无效添加(小部件类型*val) { 值。推回(val); } 样板 操作员A() { unsigned int size=this->value.

我正在使用转换运算符,突然出现了一个错误
C
类派生自
B
,与类
A
没有关系,但是,调试器显示,在执行
C*val1=new C
时,val1显示为
C*{A}
。它还产生了一个错误,因为
C*
指针中的
A
的大小不合理(每次执行时它都会给出不同的大小,所以我假设它从另一个应用程序获取一个数字)

#包括
#包括
样板
甲级
{
公众:
std::向量值;
虚拟~A(){}
无效添加(小部件类型*val)
{
值。推回(val);
}
样板
操作员A()
{
unsigned int size=this->value.size();
std::向量返回值;
返回_值。保留(大小);
for(无符号整数i=0;ivalue[i]);
}
目标;
target.value=返回值;
回报目标;
}
};
B类
{
公众:
虚拟~B(){}
};
丙类:公共乙类
{
公众:
作废打印()
{
std::cout
for(无符号整数i=0;ivalue[i]);
}
通过访问空向量上的
返回值[i]
调用未定义的行为。

for(unsigned int i=0;ivalue[i]);
}

通过访问空向量上的
return\u value[i]
调用未定义的行为。

hmm,但是
return\u value.reserve(size)
已经为该向量保留了足够的空间。我应该使用
return\u value.resize(size)吗
那么?@Salty28:是的,你应该这样做。否则,根据这个答案,行为是未定义的。@Salty27
reserve()
只为基础数组分配内存,它不会在该数组中创建对象。访问
返回值[i]
需要完全构造的对象。运算符[]
[0..size)
,而不是
[0..capacity)
你所期望的。因此,是的,使用
resize()
而不是
reserve()
@RemyLebeau非常感谢你的解释。那么什么时候应该
reserve()
是否被使用?我是否应该创建一个单独的问题?@Salty27是的,这将保证一个新的问题。虽然我确信你可以找到大量已发布的副本。嗯,但是
返回值。保留(大小)
已经为该向量保留了足够的空间。我是否应该使用
返回值。调整大小(大小)
那么?@Salty28:是的,你应该这样做。否则,根据这个答案,行为是未定义的。@Salty27
reserve()
只为基础数组分配内存,它不会在该数组中创建对象。访问
返回值[i]
需要完全构造的对象。运算符[]是
[0..size)
,而不是
[0..capacity)
你所期望的。因此,是的,使用
resize()
而不是
reserve()
@RemyLebeau非常感谢你的解释。那么什么时候应该
reserve()
是否被使用?我是否应该创建一个单独的问题?@Salty27是的,这将需要一个新问题。尽管我相信你可以找到大量已经发布的重复问题。
#include <iostream>
#include <vector>

template<typename widget_type>
class A
{
public:
    std::vector<widget_type*> value;

    virtual ~A() {}

    void Add(widget_type* val)
    {
        value.push_back(val);
    }
    template<typename return_type>
    operator A<return_type>()
    {
        unsigned int size = this->value.size();
        std::vector<return_type*> return_value;
        return_value.reserve(size);
        for (unsigned int i = 0; i < size; i++)
        {
            return_value[i] = dynamic_cast<return_type*>(this->value[i]);
        }
        A<return_type> target;
        target.value = return_value;
        return target;
    }
};

class B
{
public:
    virtual ~B() {}
};

class C : public B
{
public:
    void Print()
    {
        std::cout << "C CALL\n";
    }
};

class D : public B
{

};

int main()
{
    std::cout << "Start!\n";
    A<C> source;
    C* val1 = new C;
    source.Add(val1);
    A<B> target = source;
    A<B>* target2 = dynamic_cast<A<B>*>(&source);

    std::cout << "END\n";
}```
    for (unsigned int i = 0; i < size; i++)
    {
        return_value[i] = dynamic_cast<return_type*>(this->value[i]);
    }