Salty 27
Salty 27

Reputation: 91

C++ operator new returns unexpected value

I am working with conversion operators and I an error just popped out of nowhere. C class is derived from B and has no relation with class A, however, debugger shows that when doing C* val1 = new C val1 is showed as C* {A<B>}. It also produces an error because that A in the C* pointer has a size of an unreasonable size (it gives a different size each time it is executed so I just suppose it gets a number from another application).

#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";
}```

Upvotes: 1

Views: 71

Answers (1)

Mike Vine
Mike Vine

Reputation: 9837

    for (unsigned int i = 0; i < size; i++)
    {
        return_value[i] = dynamic_cast<return_type*>(this->value[i]);
    }

You are invoking undefined behaviour by accessing return_value[i] on an empty vector.

Upvotes: 4

Related Questions