はじめまして、こんばんは
redhat98です
MacOSX, Qt4でC++のプログラミングをやっているのですが、変数のスコープについて疑問があります。
GUIを手書きで作っているのですが、
MainWindow::MainWindow(QWidget *parent)
: QLabel(parent, Qt::Window)
{
QPixmap m_Image; //ここでメモリーリークは発生しないのか?
m_Image.load(":/test.png"); //画像の読み込み
setPixmap(m_Image); //画像をウィジェットに設定する
}
setPixmap(m_Image);はvoid setPixmap ( const QPixmap & )と宣言されています。
void (const QPixmap)と宣言されていれば、
自動的にインスタンスをコピーしてくれるので大丈夫だと思いますが
QPixmap m_Image;のと私は宣言をしているのでメモリリークが発生しないのか疑問です。
この場合は、*.hに「QPixmap m_Image;」とか「QPixmap *m_Image;」と書くのが妥当なのでしょうか?
C++のスコープについて
Re:C++のスコープについて
> メモリリークが発生しないのか疑問です。
どのようにしてメモリリークが発生すると考えていますか?
ちなみに、値渡しの方がメモリリークの可能性は高くなると思います。スライシングという言葉を聞いたことがありませんか?
どのようにしてメモリリークが発生すると考えていますか?
ちなみに、値渡しの方がメモリリークの可能性は高くなると思います。スライシングという言葉を聞いたことがありませんか?
Re:C++のスコープについて
>どのようにしてメモリリークが発生すると考えていますか?
QPixmap m_Image;はスタックに積まれるハズなので、
コンストラクタを終えた時点でメモリから削除されると思います。
そして、後でそこを参照するした場合に問題が発生すると考えています。
よく考えてみるとメモリリークというか、メモリの不正な領域の参照でしたね
QPixmap m_Image;はスタックに積まれるハズなので、
コンストラクタを終えた時点でメモリから削除されると思います。
そして、後でそこを参照するした場合に問題が発生すると考えています。
よく考えてみるとメモリリークというか、メモリの不正な領域の参照でしたね
Re:C++のスコープについて
>setPixmapの仕様次第ですね。
なぜですか?
無条件でスタックからデータが降ろされるのではないんですか?
くだらない質問で申し訳ありませんが、
ポインタじゃないメンバ変数を初期化する時は
初期化子でするのがデフォルトなのでしょうか?
質問ばかりで申しわかりません。
なぜですか?
無条件でスタックからデータが降ろされるのではないんですか?
くだらない質問で申し訳ありませんが、
ポインタじゃないメンバ変数を初期化する時は
初期化子でするのがデフォルトなのでしょうか?
質問ばかりで申しわかりません。
Re:C++のスコープについて
> >setPixmapの仕様次第ですね。
> なぜですか?
> 無条件でスタックからデータが降ろされるのではないんですか?
setPixmapの内部でQPixmapを複製しているかどうかが重要だと思いますよ。
複製していない場合→不正アクセスの可能性がある。
複製している場合→不正アクセスの可能性なし(まあ、実装次第でしょうが。。)。
> なぜですか?
> 無条件でスタックからデータが降ろされるのではないんですか?
setPixmapの内部でQPixmapを複製しているかどうかが重要だと思いますよ。
複製していない場合→不正アクセスの可能性がある。
複製している場合→不正アクセスの可能性なし(まあ、実装次第でしょうが。。)。
Re:C++のスコープについて
>setPixmapの内部で QPixmapを複製しているかどうかが重要だと思いますよ。
ひとまず問題なく動いているので、そのまま使ってみることにします。
フレームワークなのでちゃんと、そこまで考えてくれているんじゃないかなと思います。
ありがとうございました。
ひとまず問題なく動いているので、そのまま使ってみることにします。
フレームワークなのでちゃんと、そこまで考えてくれているんじゃないかなと思います。
ありがとうございました。