掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
ポインタに代入した時のアドレス (ID:205)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
はじめまして。 stringは、メモリの節約のため、普段は参照カウントを使って同じメモリを共有しています。例えば、 var a,b : string; a := 'Sample'; b := a; などというコードを書くと、コンパイラはbに対してaのコピーを作成するのではなく、a の stringのポインタを参照させます。 (なんとなくstringってクラスみたいな感じですね) それで、bに対して変更を行ったときに初めて UniqueStringAなる関数を持ち出して、 aのコピーを作成、bに渡したのち、そのメモリに対して変更を行います。 (ただこの関数はコンパイラ内部でしか使えないようです) それでは、コンパイラがどう言ったときにメモリの参照を変更するのか、 ということが非常に問題になってくるわけですが、 string を PCharにキャストしただけではメモリの参照は変わりません。 コンパイラはキャスト時に、StringToPCharという関数… 関数!? …を使用してポインタの値を取得します。 (まさか型キャストにコンパイラが内部で関数を呼び出しているとは今日まで知りませんでしたが…) 問題はストリングに対してアドレス計算をした時で、まあ…たいていアドレス確保した、ということは変更するつもり…ということなんでしょうか、コンパイラはここで別のメモリを割り当てて、参照解除してしまいます。 データが更新されない、メモリが異なる、というのはそのためです。 アクセス違反については私の環境(Del6Pro)でも確認できなかったため、 なんとも言えませんが、ブレークポイントをかけてCPUViewを覗いて調べてみることをお勧めします。 P := PChar(str); P := @str[1]; 一見同じコードを生成しそうなものですけどねぇ…(^^; とにかくstringの演算はユーザのメモリ管理を簡単にするため、 := や @ が「嘘」の演算をしている感じです。 C++ユーザーさんだったら普通に感じるのかなぁ… 私はDelphiばかり使ってたので…。
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.