1

NULL で終了する char * から文字を効率的に削除したい状況があります。着信文字列が大きいと想定できます (つまり、コピーするのは効率的ではありません)。しかし、未使用のメモリの割り当てを解除する必要はないと仮定することもできます。

このタスク (返されたイテレータの文字を NULL ターミネータに置き換える) に使用できると考えstd::remove_if、次のテスト プログラムをセットアップして、構文が正しいことを確認しました。

#include <algorithm>
#include <iostream>

bool is_bad (const char &c) {
  return c == 'a';
}

int main (int argc, char *argv[]) {
  char * test1 = "123a45";
  int len = 6;
  std::cout << test1 << std::endl;
  char * new_end = std::remove_if(&test1[0], &test1[len], is_bad);
  *new_end = '\0';
  std::cout << test1 << std::endl;

  return 0;
}

このプログラムはコンパイルされますが、Segmentation Faultどこかで取得してremove_ifいます-ここからの出力は次のgdbとおりです。

Program received signal SIGSEGV, Segmentation fault.
0x0000000000400914 in std::remove_copy_if<char*, char*, bool (*)(char const&)> (__first=0x400c2c "45", __last=0x400c2e "", __result=0x400c2b "a45", 
    __pred=0x4007d8 <is_bad(char const&)>) at /usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:1218
1218                *__result = *__first;

これはgcc 4.1.2RedHat 4.1.2-52 にあります。

私の理解では、生のポインターはとして使用できますForwardIteratorsが、おそらくそうではないでしょうか? 助言がありますか?

4

2 に答える 2