C++ 避免在变量超出范围后指针指向无效内存

C++ 避免在变量超出范围后指针指向无效内存,c++,pointers,C++,Pointers,以下代码有效(Visual Studio 2013) 一旦块退出,在花括号内定义的任何内容都不再存在。就我所见,这些括号没有任何作用-删除它们,或者在花括号之外(之前)启动myA先创建元素对象怎么样 int main() { base myBase; A myA; B myB; vector<base*> v(4); v[0] = &myBase; v[1] = &myA; v[2] = &myB;

以下代码有效(Visual Studio 2013)


一旦块退出,在花括号内定义的任何内容都不再存在。就我所见,这些括号没有任何作用-删除它们,或者在花括号之外(之前)启动
myA

先创建元素对象怎么样

int main() {
    base myBase;
    A myA;
    B myB;

    vector<base*> v(4);

    v[0] = &myBase;
    v[1] = &myA;
    v[2] = &myB;
    v[3] = v[1];

    v[0]->setData(9);
    v[1]->setData(19);
    v[2]->setData(29);
    v[3]->setData(39)

    .
    .
    .
}
intmain(){
base myBase;
myA;
B多年电价;
向量v(4);
v[0]=&myBase;
v[1]=&myA;
v[2]=&myB;
v[3]=v[1];
v[0]->setData(9);
v[1]>setData(19);
v[2]>setData(29);
v[3]->设置数据(39)
.
.
.
}

这样,容器总是在它指向的对象之前被销毁。

您总是可以在堆上而不是堆栈上创建myA onject

A* myA = new A();
但是,在使用完指针之后,您应该更改赋值并删除它

{
// code
v[1] = myA;
// code
}
// code
// somewhere 
delete myA;

或者你可以去掉那些括号。或者在括号外声明myA。

您可以使用std::shared\u ptr和自定义删除程序来避免删除现有资源:

#include <vector>
#include <memory>

void no_delete(void*) {};

int main() {

    int a = 0;
    int b = 0;
    int c = 0;
    std::vector< std::shared_ptr<int> > v(4);

    // assign/create resources
    {
        v[0] = std::shared_ptr<int>(&a, no_delete);
        v[1] = std::shared_ptr<int>(&b, no_delete);
        v[2] = std::shared_ptr<int>(&c, no_delete);
        v[3] = std::make_shared<int>(1);
    }
}
#包括
#包括
void no_delete(void*){};
int main(){
int a=0;
int b=0;
int c=0;
std::vectorv(4);
//分配/创建资源
{
v[0]=std::shared_ptr(&a,no_delete);
v[1]=std::shared_ptr(&b,no_delete);
v[2]=std::shared_ptr(&c,no_delete);
v[3]=std::make_shared(1);
}
}

v[1]=新的A?或者更好地使用共享指针。你说“像这样的东西”是什么意思?然后你需要指定,因为没有解释,它们看起来只是为了清晰而存在。我再次建议在块外启动
myA
,稍后再对向量元素进行asign
A* myA = new A();
{
// code
v[1] = myA;
// code
}
// code
// somewhere 
delete myA;
#include <vector>
#include <memory>

void no_delete(void*) {};

int main() {

    int a = 0;
    int b = 0;
    int c = 0;
    std::vector< std::shared_ptr<int> > v(4);

    // assign/create resources
    {
        v[0] = std::shared_ptr<int>(&a, no_delete);
        v[1] = std::shared_ptr<int>(&b, no_delete);
        v[2] = std::shared_ptr<int>(&c, no_delete);
        v[3] = std::make_shared<int>(1);
    }
}