アプリ版:「スタンプのみでお礼する」機能のリリースについて

#include <stdio.h>
#include <vector>
#include "SanaeStr.h"
int main(void){
std::vector<sanae::str> test;
test.add("hello");
printf("%s",test[0].c_str());
}

sanae::strのコード(github):
https://github.com/ubproject/Useful-headers/blob …

168行目のsfree()でブレークポイントが発生しましたって出てしまいました。
sfree関数は
#define sfree(d){free(d);d=NULL;}
ってやってあるので同じポインタにfreeをしないようにしてあるのですがなってしまって
訳が分かりません。
(メモリの内容を見るとfreeされているからNULLになってるはずがなぜかNULLになっていない。)
色々つけ足しながら作ってたのでごちゃごちゃしてますがやさしめに教えていただけると嬉しいです。

A 回答 (2件)

もうちょっと具体的に詳細を書いてくれませんか?


どんなソフトで作って実行しているのですか?

「ブレークポイントが発生しました」の前後に何かかいてないですか?



・std::vectorの要素としてクラスを指定する場合、コピーコンストラクタまたはムーブコンストラクタが必要となってきます。
定義してない場合はデフォルトのものが使われます。
デフォルトのコンストラクタで「浅いコピー」で作られたために、複数のstrインスタンスで、同じアドレスを示すstを持ってしまい、それぞれがfreeしようとして最初のだけ成功する、というのはありそうです。


・直接は関係ないかもしれませんが、正直読み難いです。
mallocのサイズ計算を間違えていないか?とも思っているのですが
(少なくとも char* str1 = (char*)malloc(sizeof(char*) * position); 等は、結果オーライなだけで、正しくはありません)
mallocやfreeがあちらこちらに散らかっていて確認し辛いです。
メソッドにまとめるとかしましょう。
    • good
    • 1
この回答へのお礼

ありがとうございます。
メソッドにまとめてやってみますありがとうございます。

お礼日時:2022/01/03 12:54

#1 でいわれている通り


コピーコンストラクタがないのでシャローコピーされて死亡
だろうなぁ.

というか, これって下手すると
str a="hoge"; str b = "foo";
a = b;
みたいに代入するだけでアウトとかなってないか?

余談だけど, ヘッダで無駄に #define するのはやめてほしい. 使う人が絶対に困る.
    • good
    • 1
この回答へのお礼

ありがとうございます。
代入に関しては問題ありませんでした。

#defineの方は消しておきます。

お礼日時:2022/01/03 12:55

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!