C++ 在c+;中,指向向量中对象的指针存在小问题+;

C++ 在c+;中,指向向量中对象的指针存在小问题+;,c++,vector,C++,Vector,考虑以下代码: 类测试{ 公众: int n; 测试(int n):n(n){} }; int main(){ 向量v; 试验一(1)、二(2); v、 推回(一); v、 推回(两个); //显然不起作用,因为对象的副本存储在 //向量==>不同的内存加法 测试*p1=&1; //也无法正常工作,因为当对象被擦除时, //此指针指向另一个对象 测试*p2=&v[0]; v、 擦除(v.begin()); //打印2,因为对象2已复制到对象1的位置 正如前面所说,您应该将std::shared_

考虑以下代码:

类测试{
公众:
int n;
测试(int n):n(n){}
};
int main(){
向量v;
试验一(1)、二(2);
v、 推回(一);
v、 推回(两个);
//显然不起作用,因为对象的副本存储在
//向量==>不同的内存加法
测试*p1=&1;
//也无法正常工作,因为当对象被擦除时,
//此指针指向另一个对象
测试*p2=&v[0];
v、 擦除(v.begin());
//打印2,因为对象2已复制到对象1的位置

正如前面所说,您应该将std::shared_ptr与std::weak_ptr一起使用。下面是使用现代方法对代码的重写:

#include <iostream>
#include <memory>
#include <vector>

class test {
    public:
    int n;
    test(int n) : n(n) {}
};

int main() {
    std::vector<std::shared_ptr<test>> v;
    std::shared_ptr one = std::make_shared<test>(1);
    std::shared_ptr two = std::make_shared<test>(2);
    v.push_back(one);
    v.push_back(two);

    std::weak_ptr<test> p1 = one;
    std::weak_ptr<test> p2 = v[0]; 
    
    // prints 1 two times
    if (auto sp = p1.lock()) {
        std::cout << sp->n << std::endl; 
    }
    if (auto sp = p2.lock()) {
        std::cout << sp->n << std::endl; 
    }
    
    // delete all references to one
    v.erase(v.begin());
    one = nullptr;
 
    // nothing gets printed
    if (auto sp = p1.lock()) {
        std::cout << sp->n << std::endl; 
    }
    if (auto sp = p2.lock()) {
        std::cout << sp->n << std::endl; 
    }
    return 0;
}
#包括
#包括
#包括
课堂测试{
公众:
int n;
测试(int n):n(n){}
};
int main(){
std::向量v;
std::shared_ptr one=std::make_shared(1);
std::shared_ptr two=std::make_shared(2);
v、 推回(一);
v、 推回(两个);
标准:弱ptr p1=一;
std::弱_ptr p2=v[0];
//打印1两次
如果(自动sp=p1.lock()){

std::cout n如前所述,您应该将std::shared_ptr与std::weak_ptr一起使用。下面是使用现代方法对代码的重写:

#include <iostream>
#include <memory>
#include <vector>

class test {
    public:
    int n;
    test(int n) : n(n) {}
};

int main() {
    std::vector<std::shared_ptr<test>> v;
    std::shared_ptr one = std::make_shared<test>(1);
    std::shared_ptr two = std::make_shared<test>(2);
    v.push_back(one);
    v.push_back(two);

    std::weak_ptr<test> p1 = one;
    std::weak_ptr<test> p2 = v[0]; 
    
    // prints 1 two times
    if (auto sp = p1.lock()) {
        std::cout << sp->n << std::endl; 
    }
    if (auto sp = p2.lock()) {
        std::cout << sp->n << std::endl; 
    }
    
    // delete all references to one
    v.erase(v.begin());
    one = nullptr;
 
    // nothing gets printed
    if (auto sp = p1.lock()) {
        std::cout << sp->n << std::endl; 
    }
    if (auto sp = p2.lock()) {
        std::cout << sp->n << std::endl; 
    }
    return 0;
}
#包括
#包括
#包括
课堂测试{
公众:
int n;
测试(int n):n(n){}
};
int main(){
std::向量v;
std::shared_ptr one=std::make_shared(1);
std::shared_ptr two=std::make_shared(2);
v、 推回(一);
v、 推回(两个);
标准:弱ptr p1=一;
std::弱_ptr p2=v[0];
//打印1两次
如果(自动sp=p1.lock()){

std::n一个
shared_ptr
s的向量对你有用吗?然后你可以为它们的元素创建
weak_ptr
s。听起来你想要
std::vector
中的对象,并引用这些对象。还要注意,你的示例代码有更多的问题。即使你不删除向量中的元素,也需要一个指向它的指针当向量的容量发生变化且其所有元素都移动到新位置时,仍然会变得无效。@AVH是的,我也知道这个问题,但很高兴听到智能指针在这种情况下可以帮助我,如果你没有被困在一个大项目中,而你必须以给定的方式解决问题,,,我建议发布原始问题lem和以上作为建议的解决方案。因此,如果可能的话,人们可以提出更好的替代方案。这一个让人感觉你在为未来的需求变化招来痛苦的世界。你需要一个
shared_ptr
s的向量为你工作吗?然后你可以为他们的元素创建
weak_ptr
s。听起来你想要
std::vec中的对象tor
,并引用这些对象。还请注意,示例代码还有更多问题。即使不删除向量中的元素,当向量的容量发生变化且其所有元素都移动到新位置时,指向该元素的指针仍可能无效。@AVH是的,我也知道这个问题,但很高兴听到这个聪明的观点在这种情况下,ers可以帮助我,如果你没有被困在一个大项目中,你必须以给定的方式解决问题,,,我建议将原始问题和以上问题作为建议的解决方案发布。这样,如果可能的话,人们可以提出更好的替代方案。这一个感觉就像你在为未来的需求变化带来痛苦