基本上,我要达到的目的是使用指针,避免使用new
关键字来获得相同的复制行为,就像在某些其他语言中一样(运算符=
向左侧分配右操作数的引用如果我们谈论对象,则类似于shared_ptr
应该提供的对象)。如果我不使用数组运算符[]
,我要显示的内容似乎可以正常工作。为什么会发生这种情况,我该如何解决?
// Declaration way before
std::vector<int>* test;
test = &std::vector<int>();
(*test)[1] = 0;
// Declaration way before
std::map<std::string, int>* test;
test = &std::map<std::string, int>();
(*test)["a"] = 0;
该错误发生在两者的最后一行。
答案 0 :(得分:4)
test = &std::vector<int>();
这不是有效的C ++。您不能使用临时地址。
不幸的是,作为扩展,Visual Studio确实允许您执行此操作。您得到的指针是立即悬空的(因为该行末尾的临时死点)。然后,您尝试使用向量进行的所有操作(不存在)都具有不确定的行为。
(即使它是一个有效的指针,您也要尝试为不存在的元素建立索引。)
只要将适当的命名对象保留在范围内的某个位置,就可以执行所需的操作。您可以获取指向该对象的指针,并在各处获得参考语义。但是,这很危险,因为在需要时,很难确保所指向的对象是活动的。这就是存在智能指针的原因。
在C ++中,最好还是坚持使用值语义。按设计使用时最好使用该语言。
答案 1 :(得分:2)
您正在将对临时矢量的引用分配给指针。临时人员立即死亡,您的指针晃来晃去。
您还尝试访问向量的第二个元素,该元素的大小为0
。
您可以尝试这样做,但是我们已经不在new
delete
时代。
std::vector<int>* test;
test = new std::vector<int>(2);
(*test)[1] = 0;
// done with test
delete test;
答案 2 :(得分:2)
不能使用数组运算符来基于数组的指针
如果指针指向对象,则可以。你的不是。
使用指针,避免使用new关键字来获得与某些其他语言相同的复制行为
您并没有真正显示出想要的行为,也没有说出您想模仿的语言,但是总的来说:用语言B编写语言A代码是个坏主意。两者会有不同的约定,习惯用语和细微之处。
如果要做坚持要编写看起来像另一种语言的C ++,则需要弄清楚所需的特定行为,以及如何在C ++中实现该行为,以使其看起来相似。这通常是很多工作,而编写看起来像您想要的方式并恰好可以编译的C ++代码并不是一个足够的解决方案。
正如Lightness指出了您的近距离错误,我只想提一下,通过编写诸如canp之类的金丝雀类型来检查您对这些东西的理解是很简单的
BasicModal
现在您可以轻松地在调试器中单步执行代码,或者只运行它并查看输出...