【问题标题】:std::vector the element is still exist after invoking deletestd::vector 元素在调用删除后仍然存在
【发布时间】:2023-02-03 16:39:11
【问题描述】:

我有这段代码我不明白为什么我需要删除然后 pop_back() 我可以只做 1 次手术吗?

struct T
 {
    T(int n):x(n){};
    int print() {
       return x; 
    };
    private:
        int x;
 };

int main(int argv,char** argc)
{
   

    std::vector t = { new T(1),new T(2)};
    delete t.back();
    std::cout << t.size() << std::endl;
    std::cout << t.back()->print() << std::endl;

    t.pop_back();
    std::cout << t.size() << std::endl;
    std::cout << t.back()->print() << std::endl;

 

    return 0;
}

删除后你可以看到的输出我看起来像向量仍然持有没有对象的元素

2
179185600
1
1 

我的问题是为什么我需要删除然后删除,不能在单个命令中完成相同的操作吗?

【问题讨论】:

  • @ynn 以及谁将释放调用new 的内存??
  • 你打算创建一个指针向量吗?
  • 你不必须使用newdelete。谁告诉你那是错的。

标签: c++ c++17 stdvector


【解决方案1】:

这一行:

delete t.back();

未从 std::vector 中删除任何元素。您的std::vector 持有指针,并且它将继续持有相同的指针。
上面一行所做的是释放对象指出std::vector 中的元素。

这一行(第一次出现):

std::cout << t.back()->print() << std::endl;

调用 UB (Undefined Behavior),因为您在指针被 deleteed 后取消引用它。

然后:

t.pop_back();

最后一个指针(你deleteed,即释放的那个)从std::vector中移除,t.back()是你插入的另一个指针,它仍然有效。

【讨论】:

  • 所以如果我理解你是对的,删除只会删除创建的对象,而不是指向该对象的指针,对吗?
  • 对,那是正确的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-19
  • 1970-01-01
  • 2011-09-27
  • 2016-04-07
  • 2012-07-02
相关资源
最近更新 更多