【发布时间】:2019-05-25 13:39:28
【问题描述】:
我花了好几个小时试图找出问题出在哪里,但这似乎很奇怪。
我以更容易理解的方式重写了我的问题。
当它到达删除的行时,调试器会创建一个断点。
附言。有趣的是,如果我们将 int b1 移到 Base2 中,它就可以工作。
基础1:
#pragma once
class Base1
{
public:
Base1();
~Base1();
int b1;
};
Base2.h:
#pragma once
#include <iostream>
#include <vector>
class Derived;
class Base2
{
public:
Base2();
~Base2();
std::vector <std::vector <Base2*>> vec;
void doSomething(Derived& d);
};
Base2.cpp:
#include "Base2.h"
#include "Derived.h"
Base2::Base2()
{
//the numbers 1 and 5 does not really metter
vec.resize(1);
vec[0].resize(5);
}
Base2::~Base2()
{
}
void Base2::doSomething(Derived& d)
{
vec[0][d.b1] = new Derived();
delete vec[0][d.b1];
}
派生:
#pragma once
#include "Base1.h"
#include "Base2.h"
class Derived : public Base1, public Base2
{
public:
Derived();
~Derived();
};
主要:
#include <iostream>
#include "Derived.h"
int main()
{
Derived d;
d.b1 = 1;
d.doSomething(d);
}
【问题讨论】:
-
我建议你学习智能指针;
std::unique_ptr、std::shared_ptr&std::weak_ptr(和朋友;std::make_unique、std::make_shared)并停止使用手动内存管理(原始new和delete)。 -
未定义的行为,因为
Base2没有虚拟析构函数。您可以使用Base2 * p = new Derived; delete p;实现相同的(未定义的行为,可能会或可能不会导致运行时错误)。通过将int b1移动到Base2碰巧起作用的事实是偶然的 - 行为仍未定义。 -
谢谢大家。那么为什么如果将 int b1 移动到 Base2 它可以工作呢?我需要一个用于 Base1 的虚拟机吗?或者为什么不呢? (我会看一下重复的问题,那里可能也有答案 - (已编辑:)它没有,因为我们正在谈论两个基地)。
-
简单地说:undefined behavior is undefined。这也是一本好书;)
标签: c++