C++のスコープについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
redhat98

C++のスコープについて

#1

投稿記事 by redhat98 » 15年前

はじめまして、こんばんは
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;」と書くのが妥当なのでしょうか?

たかぎ

Re:C++のスコープについて

#2

投稿記事 by たかぎ » 15年前

> メモリリークが発生しないのか疑問です。

どのようにしてメモリリークが発生すると考えていますか?
ちなみに、値渡しの方がメモリリークの可能性は高くなると思います。スライシングという言葉を聞いたことがありませんか?

redhat98

Re:C++のスコープについて

#3

投稿記事 by redhat98 » 15年前

>どのようにしてメモリリークが発生すると考えていますか?

QPixmap m_Image;はスタックに積まれるハズなので、
コンストラクタを終えた時点でメモリから削除されると思います。
そして、後でそこを参照するした場合に問題が発生すると考えています。

よく考えてみるとメモリリークというか、メモリの不正な領域の参照でしたね

たかぎ

Re:C++のスコープについて

#4

投稿記事 by たかぎ » 15年前

setPixmapの仕様次第ですね。

redhat98

Re:C++のスコープについて

#5

投稿記事 by redhat98 » 15年前

>setPixmapの仕様次第ですね。
なぜですか?
無条件でスタックからデータが降ろされるのではないんですか?

くだらない質問で申し訳ありませんが、
ポインタじゃないメンバ変数を初期化する時は
初期化子でするのがデフォルトなのでしょうか?

質問ばかりで申しわかりません。

Poco

Re:C++のスコープについて

#6

投稿記事 by Poco » 15年前

> >setPixmapの仕様次第ですね。
> なぜですか?
> 無条件でスタックからデータが降ろされるのではないんですか?

setPixmapの内部でQPixmapを複製しているかどうかが重要だと思いますよ。
複製していない場合→不正アクセスの可能性がある。
複製している場合→不正アクセスの可能性なし(まあ、実装次第でしょうが。。)。

redhat98

Re:C++のスコープについて

#7

投稿記事 by redhat98 » 15年前

>setPixmapの内部で QPixmapを複製しているかどうかが重要だと思いますよ。
ひとまず問題なく動いているので、そのまま使ってみることにします。
フレームワークなのでちゃんと、そこまで考えてくれているんじゃないかなと思います。

ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る