在构造函数 c++ 中初始化属性时出现问题
Problem while initializing attribute in constructor c++
当我尝试调试时 出现错误: "最终.exe项目中0x5784F2F6时未处理的异常(ucrtbased.dll(:将无效参数传递给将无效参数视为致命的函数。 尝试了所有事情都不知道如何解决这个问题。
using namespace std;
class Map :
{
private:
double *mhours_played;
string *maps;
unsigned element_num;
public:
Map()
{
maps[2] = { "Summoner's rift", "Aram" };
element_num = 2; mhours_played[2] = {};
}
~Map() { delete[] maps; }
};
这些陈述
maps[2] = { "Summoner's rift", "Aram" };
mhours_played[2] = {};
没有意义。 映射和mhours_played
是构造函数主体中具有不确定值的指针。它们不是您想象的数组。例如,表达式maps[2]
是 std::string 类型的标量对象。
定义构造函数至少像
Map() : mhours_played( new double[2]() ),
maps( new std::string[2] { "Summoner's rift", "Aram" } ),
element_num( 2 )
{
}
和析构函数一样
~Map()
{
delete[] maps;
delete[] mhours_played;
}
这里的关键误解似乎是堆栈和堆分配之间的区别。如果我们通常在函数中为数组分配空间,您的代码将(几乎(正确:
#include <string>
int main() {
std::string maps[2] = {"Chad", "Zimbabwe"};
}
这是完全有效的,并且按预期工作。但是,您要做的是为内存位置maps
中的字符串数组动态分配空间。此语法如下所示:
#include <string>
int main() {
std::string* maps;
maps = new std::string[2];
// ... more code ...
// always free your memory!
delete[] maps;
}
这会告诉操作系统,"嘿!我想要一些数组的内存,我可以有一些吗?"操作系统(希望(说"是的,你去玩得开心。
目前,您的代码尝试访问未分配内存中的第二个索引,操作系统确实不喜欢这样。
我希望这有所帮助,如果您需要进一步澄清,请告诉我。
相关文章:
- 在构造函数 c++ 中初始化属性时出现问题
- 我对 MyGraph 属性顶点名称和边权重有问题
- 在使用 std::sort() 和 lambda 函数按属性对 ADT 的向量进行排序时遇到问题
- 程序在没有输入的情况下退出,它有基本的,驱动的类属性初始化问题
- [[GNU :: pure]]功能属性和线程的优化问题
- 有关QT属性的问题
- 属性私有时遇到问题
- 更新对象的属性时遇到问题?
- 如何使用Qi :: Hold []解析器指令.(带有boost ::交换的属性类型的问题)
- 作用域问题:如何从类外查看(不访问也不修改!)私有属性
- Visual C++ 2013、TFS 和属性表的问题
- wx属性网格自定义滑块属性问题
- 将对象的属性传递到方法时出现作用域问题.(opencv相关)
- Boost.精神语法.属性和所有问题(_V)
- 灵气属性传播问题与单成员结构.
- 转换为 Unicode 时提升属性树问题
- 将get_value与 Boost 的属性树一起使用时遇到问题
- 问题:何时使用继承与设置属性
- 使用Google Protocol Buffer和Protobuf-C#将双重属性从C++转移到C#的问题
- 读取int*类型的结构属性值时遇到问题