我有關於下面的代碼,它崩潰的問題。我在testfunction()中創建一個局部變量,然後將它(變量「y」)推入列表中。這個變量有一個對象類型爲Ball的成員指針「b」。據我所知,這個局部變量「y」在堆棧中,所以它的析構函數將在testfunction()完成後調用。另外,據我所知,一個向量將一個對象「複製」到它的列表中。從我所瞭解到的情況來看,如果在其類中存在一個指針,那麼最好刪除析構函數中的指針。所以,在例子的析構函數中有「delete b」。崩潰問題 - 使用指針和析構函數的C++代碼設計
我遇到的問題是對象y.b在testfunction()完成時被銷燬。在main()中,我能夠看到「name」的值和「b」的地址,但對象「b」已經被刪除。我想避免這一點。
我認爲有代碼設計/使用指針與引用等問題請引導我在正確的方向,我是一個白癡!
#include <iostream>
#include <string>
#include <vector>
using namespace std;
class Ball
{
public:
int a;
Ball()
{
a = 0;
}
~Ball()
{
cout << "destroyed Ball()" << endl;
}
};
class Example
{
public:
string name;
Ball* b;
Example()
{
name = "";
b = NULL;
}
~Example()
{
cout << "destroying Example()" << endl;
delete b;
}
};
void testfunction(vector<Example>& list)
{
cout << "entered testfunction1()" << endl;
Example y;
y.name = "myName";
y.b = new Ball();
y.b->a = 5;
cout << "y.b->a = " << y.b->a << endl;
list.push_back(y);
cout << "exit testfunction1()" << endl;
}
void testfunction2()
{
cout << "entered testfunction2()" << endl;
Example* y = new Example();
cout << "exit testfunction2()" << endl;
}
int main() {
vector<Example> list;
testfunction(list);
//testfunction2();
if(list[0].b == NULL)
cout << "b is null" << endl;
else
cout << "b is not null" << endl;
cout << list[0].name << endl;
cout << list[0].b << endl;
cout << "list[0].b->a = " << list[0].b->a << endl;
return 0;
}
仍指出這將是更適合只是爲了擺脫在這個例子中每一個指針。 – chris
嗨@chris,謝謝你的建議。我也想過這個。如果擺脫球*並把它變成球。檢查會員Ball b是否存在的最佳方法是什麼? – codeshark
使用'boost :: optional'作爲可選對象。 – chris