【发布时间】:2019-07-18 16:05:44
【问题描述】:
基本上我想要实现的是使用指针,避免使用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;
错误发生在两者的最后一行。
【问题讨论】:
-
test = &std::vector<int>();创建一个向量,获取它的地址,然后向量立即停止存在。 -
不要试图让 C++ 表现得像其他语言一样。往往效果不佳。如果你想要一个引用,只需声明一个引用。
-
即使
*test指向一个实际的空向量,(*test)[1]也会尝试访问一个不存在的元素。 -
相信我们,它确实不再存在。您正在做的事情称为未定义行为,一种可能的结果是它“有效”。
-
@uIM7AI9S 您的错误会导致未定义的行为。这意味着任何事情都可能发生。 C++ 中的许多(大多数?)错误不需要崩溃或诊断,这样的代码似乎可以工作一段时间。但事实是您的向量不存在,
push_back似乎只能工作。如果你依赖它,你最终将不可避免地开始在此处或代码的其他(看似无关的)部分中看到奇怪的崩溃和错误。不可能通过反复试验来学习 C++,没有明显的错误迹象并不能证明正确性。
标签: c++ pointers reference operators memory-address