不能使用数组运算符来基于数组的指针(读取访问冲突)

时间:2019-07-18 16:05:44

标签: c++ pointers reference operators memory-address

基本上,我要达到的目的是使用指针,避免使用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;

该错误发生在两者的最后一行。

3 个答案:

答案 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

现在您可以轻松地在调试器中单步执行代码,或者只运行它并查看输出...