Closed pavel-pimenov closed 5 years ago
везде стоит резерв. может быть такое что после "data.erase(len - 1, 1)" меняется capacity()?
нет.
using namespace std;
int main() { // your code goes here string data; data.reserve(81); data = "[$Search 5.167.174.226:50860 F?T?0?9?TTH:IHXPGJ5VK2ILSIQWIKLUCOTIXYTJGFULN27W2II"; printf ("send[1] data=[%s]\r\n[capacity=%d size= %d]", data.c_str(), data.capacity(), data.size()); data.append(1, '|'); printf ("send[2] data=[%s]\r\n[capacity=%d size= %d]", data.c_str(), data.capacity(), data.size()); data.erase(data.size() - 1, 1); printf ("send[3] data=[%s]\r\n[capacity=%d size= %d]", data.c_str(), data.capacity(), data.size());
}
починил эту проблему. сейчас сделаю PR
Dec 30 17:11:47 oracle verlihub-debug[24513]: [1] + reserve +1 send data=[][capacity=0 size= 0] Dec 30 17:11:47 oracle verlihub-debug[24513]: [2] + reserve +1 send data=[][capacity=73 size= 0] Dec 30 17:11:47 oracle verlihub-debug[24513]: [3] + reserve +1 send data=[$Search Hub:z12412342 F?T?0?9?TTH:K7DQBWW6X6ZSIKY4D65K2UDJNPXXRCPE2POGCTQ][capacity=73 size= 73] Dec 30 17:11:47 oracle verlihub-debug[24513]: [SearchToAll] Dec 30 17:11:47 oracle verlihub-debug[24513]: [!] + reserve +1 send data=[$Search Hub:z12412342 F?T?0?9?TTH:K7DQBWW6X6ZSIKY4D65K2UDJNPXXRCPE2POGCTQ][capacity=146 size= 73] addpipe = 1 flush = 0 Dec 30 17:11:47 oracle verlihub-debug[24513]: send data append=[$Search Hub:z12412342 F?T?0?9?TTH:K7DQBWW6X6ZSIKY4D65K2UDJNPXXRCPE2POGCTQ|][capacity=146 size= 74] addpipe = 1 flush = 0
Вот тут ошибка резервирования - не добавляется 1 для pipe
а при вызове добавялется
где-то ошибка.
предлагаю тупо всегда добавлять +1 к reserve меньше CPU будет жрать на вычислениях условий.
в Create_Search() - pipe = false, все верно, потому что далее идет вот такой код:
https://github.com/Verlihub/verlihub/blob/master/src/cserverdc.cpp#L871-L875
тут создается копия поискового запроса и заранее резервируется, т.к это сообщение пойдет всем одинаковое. я сделал так чтоб каждый раз перед отправкой новому юзеру не делать резерв.
либо получается что _tths = tths;
передает в _tths
не только содержимое tths
, но и само хранилище для него. может быть такое?
я временно сделаю резерв для пипки для этого места вне зависимости от копии.
я в своей ветке добавил логирование
https://github.com/pavel-pimenov/verlihub/blob/ppa-dev/src/cconndc.cpp#L92
емкость строки возрастает до 144
Dec 29 17:38:35 oracle verlihub-debug[1144]: [SearchToAll] Dec 29 17:38:35 oracle verlihub-debug[1144]: send data=[$SP 4H57CE3JBMFRDE5FFWCHC3Y6GCJAQMSAPZJSDGA kramisha][capacity=52 size= 52] addpipe = 1 flush = 0 Dec 29 17:38:35 oracle verlihub-debug[1144]: send data append=[$SP 4H57CE3JBMFRDE5FFWCHC3Y6GCJAQMSAPZJSDGA kramisha|][capacity=104 size= 53] addpipe = 1 flush = 0 Dec 29 17:38:35 oracle verlihub-debug[1144]: send data=[$Search Hub:kramisha F?T?0?9?TTH:4H57CE3JBMFRDE5FFWCHC3Y6GCJAQMSAPZJSDGA][capacity=72 size= 72] addpipe = 1 flush = 0 Dec 29 17:38:35 oracle verlihub-debug[1144]: send data append=[$Search Hub:kramisha F?T?0?9?TTH:4H57CE3JBMFRDE5FFWCHC3Y6GCJAQMSAPZJSDGA|][capacity=144 size= 73] addpipe = 1 flush = 0
т.е. где-то потерялся reserve Cделал тест
include
include
using namespace std;
int main() { // your code goes here string data; data.reserve(81); data = "[$Search 5.167.174.226:50860 F?T?0?9?TTH:IHXPGJ5VK2ILSIQWIKLUCOTIXYTJGFULN27W2II"; printf ("send[1] data=[%s]\r\n[capacity=%d size= %d]", data.c_str(), data.capacity(), data.size()); data.append(1, '|'); printf ("send[2] data=[%s]\r\n[capacity=%d size= %d]", data.c_str(), data.capacity(), data.size()); }