auto_ptrの扱い方について

このQ&Aのポイント
  • auto_ptrを使用する際にエラーが発生しました。
  • 実行時にアクセス違反が発生しました。
  • 正しいauto_ptrの使用方法を教えてください。
回答を見る
  • ベストアンサー

auto_ptr がうまく扱えません。

auto_ptr がうまく扱えません。 以下のプログラムを作ったのですが、 実行するとprintfのところでエラーが出ます。 auto_ptrはどうやって使用したらいいのでしょうか。 #include <stdio.h> #include <memory> int main(int argc, char **argv) { ____std::auto_ptr<int> a = new int(10); ____printf("%d\n", *a); ____return 0; } エラーメッセージは以下のとおりです。 "実行ファイル名" の 0x******** で初回の例外が発生しました: 0x********: 場所 0x******** を読み込み中にアクセス違反が発生しました。 "実行ファイル名" の 0x******** でハンドルされていない例外が発生しました: 0x********: 場所 0x******** を読み込み中にアクセス違反が発生しました。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

auto_ptrのconstructorは explicit auto_ptr (X* p=0) なので、 auto_ptr<int> a(new int(10)) とするのが良いでしょう。 本当はコンパイラがエラーを出力しないといけないと思うのですが、コンパイラにバグがあるのかもしれません。

miki_rise
質問者

お礼

解決しました。

miki_rise
質問者

補足

コンパイラはVC++2005です。 = を使用すると、構造体型に変換されているようです。

その他の回答 (2)

noname#208124
noname#208124
回答No.2

a.get()

miki_rise
質問者

お礼

解決しました。

miki_rise
質問者

補足

よくわかりません。:-(

  • koko_u_u
  • ベストアンサー率18% (216/1139)
回答No.1

std::auto_ptr<int> a(new int(10));

miki_rise
質問者

お礼

解決しました。

関連するQ&A

  • C言語のポインタ

    あまり意識せずにポインタを使っているせいか,次のプログラムではまってしまいました. #include<stdio.h> #include<stdlib.h> int main(void) {  int *p, q;  p = (int *)malloc(sizeof(int));  q = (int *)malloc(sizeof(int));  *p = 2;  printf("%d\n", *p);  return 0; } コンパイルエラーで実行ファイルが出力されません. このプログラムで変数qはなぜポインタじゃないのでしょうか? 次にtypedefでptr_intという型を定義したプログラムは, 上のようなエラーが出力されず,期待とおりの結果になりました. #include<stdio.h> #include<stdlib.h> typedef int* ptr_int; int main(void) {  ptr_int p, q;  p = (int *)malloc(sizeof(int));  q = (int *)malloc(sizeof(int));  *p = 2;  *q = 3;  printf("%d\n", *p);  printf("%d\n", *q); return 0; } typedefすることでなぜエラーを回避することができるのでしょうか? よろしくおねがいします.

  • 配列について(C言語)

    配列の要素において一番目の要素以外を0にするプログラムを以下のように作成したのですが(while文を*b != 0という条件で作りたい)、while文内のところが間違っているためだと思われるのですが、うまく実行されません(実行しても何も表示されない)。どのようにしたらいいのでしょうか。または、何かが抜けている、ほかの部分が間違っている等もあるためにうまく実行されないということなのでしょうか。 #include <stdio.h> int main(void) { int a[5] = {5, 78, 2, 9, 0}; int i, *b; b = &a[0]; while (*b != 0){ if(*!=a[0]) *ptr=0; else *ptr=a[0]; } for (i = 0; i < 5; i++){ printf("ptr値 =%d ptrアドレス =%p \n", *ptr, ptr); } printf("\n"); return (0); }

  • Visual C++2008でおきたエラーについて

    現在VisualC++2008でゲームを作っているのですが、 BGMをつけようと思いプログラムを少し追加したのですが test.exe の 0x005653b1 で初回の例外が発生しました: 0xC0000005: 場所 0x00000060 を読み込み中にアクセス違反が発生しました。 test.exe の 0x005653b1 でハンドルされていない例外が発生しました: 0xC0000005: 場所 0x00000060 を読み込み中にアクセス違反が発生しました。 プログラム '[2956] test.exe: ネイティブ' はコード 0 (0x0) で終了しました。 と言ったエラーが出てきてしまい止まってしまいます、とりあえずCtrl+Zで最初の状態にもどしたにもかかわらず実行しようとすると上と同じエラーが出てきてしまい起動できなくなってしまいました、上のエラーはどのようなときに起こるのでしょうか?それとどうすれば回避できるか教えてくださいm(_ _;m) ソースファイルを張りたいのですが2000文字超えているのでむりでした・・・。

  • C言語でコマンドラインの引数について。

    コマンドラインで引数をわたす基本的なプログラムは main(int argc,char *argv[]){....] ですよね。 今回実行時に、 >実行ファイル名 123 + 233 といれたら、123+233を計算してくれるプログラムを作ろうとしています。 その場合、main(int argc,int *argv[]){} としたら、argv[1]に123が入って、argv[2]に+が入って、argv[3]に233が、入るというわけではないんでしょうか? とりあえず、確認で #include<stdio.h> main(int argc,int *argv[]) { printf("%d\n%d\n",argv[1],argv[3]); } としてみたんですが、実行結果は、とても長い数字がでてきてきました。 なにがいけないのか教えてください。 お願いします。 あとWindows MEでVC++6を使ってます。

  • [C]char型のダブルポインタ

    粗雑で申し訳ありませんが、 以下のソースをコンパイルできましたが、 うまく実行できません。 自分なりに間違いがないと思うのですが、 間違い等をご指摘頂ければ助かります。 #include <stdio.h> void func(char **ptr) ptr[][10] か (*ptr)[] なら通る *ptr[] は通らない { printf("----- func -----"); printf("%s\n", *ptr); printf("%c\n", **ptr); putchar('\n'); } int main(void) { char str[5][10] = {"AAAAA", *str[] にすると func で **ptr で通る "BBBBB", "CCCCC", "DDDDD", "EEEEE", }; printf("----- main -----"); printf("%s\n", *str); printf("%c\n", **str); putchar('\n'); func(str); return (0); } 実行結果 ----- main ----- AAAAA A ----- func ----- Bus error (core dump) 関数への受け渡しで、型が違うというお叱りを受けますが、 コンパイルはできました。 コンパイラはCCです。 ではよろしくお願いします。

  • C++のコンストラクタを使った自動ポインタでoperator関数の使い

    C++のコンストラクタを使った自動ポインタでoperator関数の使い方で分からないところがあります。 環境下はVisual C++でC/C++のWin32コンソールアプリケーションを使って行っています。 下記のコードで実行させています。やっていることは文字列を反転させて表示させるだけのことです。 #include "stdafx.h" #include <string> #include <iostream> class AutoPtr { char *ptr; public: AutoPtr():ptr(0) { } ~AutoPtr() { delete [] ptr; } // char *operator=(char *ptr) { delete [] this->ptr; this->ptr = ptr; return this->ptr; } operator char *(){ return ptr; } char &operator[](int index) { return ptr[index]; } }; void reverse(char *str) { int i, n; AutoPtr work; n = strlen(str); work = new char[n+1]; strcpy(work, str); for(i=0; i<n; i++) { str[i] = work[n-i-1]; } printf("%s\n", str); } int _tmain(int argc, _TCHAR* argv[]) { reverse("ABCDEFG"); return 0; } これを実行させると、reverse関数のfor()文の、str[i] = work[n-i-1];を実行させた所で実行エラーになってしまいます。その前の、strcpy(work, str);でworkにstrの内容が正常にコピーされているところまでは確認できています。operator関数の、 char &operator[](int index) { return ptr[index]; } で、operator[]はAutoPtrを配列のように扱っているはずなのですが、何故かstr[i] = work[n-i-1]; の所で実行エラーになってしまいます。 operaror関数の書き方が悪いのか、何が原因なのか分かりかねています。御経験のあるかたは、御教示いただけたらと思っています。 よろしくお願い致します。

  • メルセンヌツイスターによる乱数の使い方

    メルセンヌツイスターによる乱数を生成したいのですが、下記コードにすると、mt_rand関数を呼ぶたびにシードが初期化され他乱数が生成されます。 やりたいことは、main関数で一度シード101で初期化した後は、mt_rand関数内では、初期化することなく継続した乱数を生成したいのです。 そのためa_mt_rand関数のようにすると、mtが定義されていないとなるエラーとなります。 namespaceの問題と思うのですが、色々試してみましたが、できませんでした。 どのようにすればできるでしょうか。 vc++11、windows11 使用 参考サイト C++ 乱数ライブラリ std::random の使い方 リンクはうまく貼れませんでした。 #pragma hdrstop #include <iostream> #include <stdio.h> #include <random> using namespace std; void mt_rand(void); int main(int argc, char *argv[]) { int ptr; std::mt19937 mt(101); // メルセンヌツイスターの32ビット版、引数は初期シード std::uniform_int_distribution <> rand100(0, 100); // [0, 99] 範囲の一様乱数 ptr = rand100(mt); printf("ptr=%d\n",ptr); mt_rand(); } void mt_rand(void) { int ptr=0; std::mt19937 mt(101); // メルセンヌツイスターの32ビット版、引数は初期シード std::uniform_int_distribution <> rand100(0, 100); // [0, 99] 範囲の一様乱数 ptr = rand100(mt); printf("%d\n",ptr); } void a_mt_rand(void) { int ptr=0; ptr = rand100(mt); printf("%d\n",ptr); }

  • バッファオーバーラン 環境変数参照

    今回私がやってみたいことは脆弱なプログラムにバッファオーバーランを起こさせそれを利用して環境変数に格納してあるshellcodeを実行させrootをゲットするということです。 コードは以下の通りです #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> char shellcode[]= "\x31\xc0\xb0\x46\x31\xdb\x31\xc9\xcd\x80\xeb\x16\x5b\x31\xc0" "\x88\x43\x07\x89\x5b\x08\x89\x43\x0c\xb0\x0b\x8d\x4b\x08\x8d" "\x53\x0c\xcd\x80\xe8\xe5\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73" "\x68"; int main(int argc , char *argv[]) { char *env[2]={shellcode,NULL}; int i; long ret,*addr_ptr; char *buffer,*ptr; buffer = malloc(40); ret = 0xbffffffa - strlen(shellcode) - strlen("./vuln2"); ptr = buffer; addr_ptr = (long *)ptr; for(i=0;i<40;i+=4) *(addr_ptr++) = ret; buffer[40-1]=0; execle("./vuln2","vuln2",buffer,0,env); free(buffer); return 0; } vuln2.cのソースです #include <string.h> int main(int argc,char *argv[]) { char buffer[5]; strcpy(buffer,argv[1]); return 0; } 実行結果です ./env Segmentation fault (コアダンプ) なぜかコアダンプしてしまいますしっかりvuln2の戻りアドレスを偽の戻りアドレス(環境変数)で上書きしているはずなのですが。 どなたかわかる方いましたら回答お願いします

  • すいません 助けてください

    #include <stdio.h> int main(void) { int a, ##########; int ##########; int vc[]={1,2,3}; a= 10; ptr = &a; b= *ptr; c=&vc[1]; printf("*ptr のデータ =###\n", ####); printf("*ptr のアドレス=####\n", ####); printf("bのデータ =####\n", ####); printf("bのアドレス=####\n", ####); printf("vc[1]のデータ=####\n", ####); printf("vc[1]のアドレス=####\n", ####); printf("cのデータ=###\n", ###); printf("cのアドレス=####\n", ####); return (0); } #の部分がわかりません 教えてください><

  • C言語のポインタについての質問です。

    C言語のポインタについての質問です。 2つのプログラムを作り、片方で数値を入力し、 もう片方でその数値を読み取りたいと思っています。 数値入力のプログラムは次のようになっています。 #include<stdio.h> void main(void){ int A=1; int *p; p=&A; printf("%p\n",p); } この実行結果は「0012FF88」となりました。 次にこの「0012FF88」というアドレスを使って「1」を読み取る 別のプログラムを作りたいと思っています。 #include<stdio.h> void main(void) { int add; int a; printf("アドレスは?\n"); scanf("%x",&add);    //「0012FF88」と入力 a=*(int*)add; printf("%x---->%d",&add,a); } このようなプログラムを作ってコンパイルできたのですが、 実行してアドレスを打ち込むと「Win32の例外が発生しました」 となって実行できません。 何かよい方法やプログラムの問題などありましたら 教えて頂けませんか?

専門家に質問してみよう