LINUX.ORG.RU

Сообщения par12b12

 

disable pseudo variables in codeigniter

Форум — Web-development

Собственно вопрос. Как их отменить полностью. Во первых я не понимаю нахер это надо вобще т.к. гораздо удобнее тоже самое сделать на PHP, а с этой фигнёй подсветки синтаксиса не добьёшься и вобще лишнее это имхо. Мне не нравится что в какой то базе данных юзер сохранит текст содержащий {elapsed_time} а при выводе вместо него отобразится что то вроде 0.0015. КАК УДАЛИТЬ? Или хотя бы как поескейпить?

PS. ИМХО верх коварства такое понавтыкать и нигде в централизованном месте не предупредить об этом.

par12b12
()

OCR: «расгладить» каптчу

Форум — Development

Имеется такая каптча:

http://i1034.photobucket.com/albums/a422/par12b12/captcha.gif

Как вы видите она как бы выпуклая в центре. Как её разгладить? Пишу на PHP с использование GD. Может там какая ф-я есть для этого?

par12b12
()

Как получить sqlstate используя mysql (не mysqli)?

Форум — Web-development

Как получить sqlstate используя mysql (не mysqli)?

par12b12
()

PHP - mysql или mysqli

Форум — Web-development

Что лучше использовать mysql или mysqli? Такое впечатление что mysqli не такое стабильное как mysql. Особенно беспокоят комментарии на этой странице документации http://us2.php.net/manual/en/mysqli.close.php :

mysqli created links cannot be «deactivated», and will continue to accumulate in process memory until the PHP server or process is restarted, essentially making mysqli.max_links = -1 required.

Получается что оно может пожрать много памяти и ни как нельзя с этим ничего сделать.

par12b12
()

MySQL выбрать записи не содержащиеся в другой таблице

Форум — Web-development

Существует такая ситуация:

create table packs (
id bigint unsigned auto_increment primary key,
name varchar(255) not null
);
create table comps (
id bigint unsigned auto_increment primary key,
name varchar(255) not null
);

create table packs_comps(
pack_id bigint unsigned not null,
comp_id bigint unsigned not null
);

Т.е. packs_comps ассоциирует packs и comps. В ней pack_id и comp_id - FOREIGN KEYS.

Как выбрать из comps только те записи которые не ассоциированы с определённой comp_id в packs_comps.

Конечно можно пойти таким путём:

$fcs = array();
$q = mysql_query(
"SELECT pack_id FROM packs_comps WHERE comp_id = $cid"
);
while ($row = mysql_fetch_assoc($q)) {
$fcs[] = $row['pack_id'];
}
mysql_free_result($q);

$fcs = count($fcs) > 0 ? "WHERE id NOT IN (".join(',',$fcs).") : "";
$q = mysql_query(
"SELECT * FROM comps $fcs LIMIT $start, $limit"
);
while ($row = mysql_fetch_assoc($q)) {
..... (code to output records here) ............
}
mysql_free_result($q);

Однако я думаю MySQL имеет ограничение на максимальный размер строки запроса, хотя не знаю на сколько оно велико. И на сколько эффективно такое решение? Как реализовать данную задачу наиболее эффективно?

par12b12
()

MySQL race condition #2

Форум — Web-development

В этой теме речь о race condition при добавлении записи в таблицу один из столбцов которой должен иметь уникальное значение (не повторяться) уже поднимался. Решение было найдено - добавить UNIQUE constraint к соответствующему столбцу в таблице и проверять возвращает ли mysql_query ошибку.

Теперь задача усложняется. Представим что у нас есть 2 таблицы `packages` и `files`. Каждый файл должен быть ассоциирован с package.

create table packages (
  id bigint unsigned auto_increment primary key,
  name varchar(255) not null
);

create table files (
  id bigint unsigned auto_increment primary key,
  name varchar(255) not null,
  path varchar(255) not null,
  package_id bigint unsigned not null
);

Здесь package_id ассоциирует файл с package.id.

Каким образом сделать так что бы files.name был уникальным для файлов из одного package'а? Очевидно что сделать files.name UNIQUE не явл. решением т.к. name должно быть уникально только в пределах одного package_id.

Такой код:

$q = mysql_query("SELECT COUNT(id) AS fn_ex FROM files WHERE name = '$file_name' AND package_id = '$package_id'");
$row = mysql_fetch_assoc($q);
mysql_free_result($q);
if ($row['fn_ex'] > 0) {
  $errors[] = "File name already in use";
} else {
  mysql_query("INSERT INTO files SET name = '$name', path = '$path', package_id = '$package_id'");
}

подвержен race condition'у (подробно описанному в предыдущей теме).

Так что же делать?

par12b12
()

EXT JS JsonStore commitChanges()

Форум — Web-development

Имеется такой код:

<?php

require_once dirname(dirname(__FILE__))."/config.php";
require_once "$base_dir/models/companies.php";

if (!isset($_SESSION['admin'])) {
	header("Location: $www_base/admin/login.php");
	exit;
}

?>

<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
<title>Admin Panel - Manage Companies</title>
<link rel="stylesheet" href="<?php techo("$www_base/css/site.css"); ?>" type="text/css" />

<link rel="stylesheet" type="text/css" href="<?php techo("$www_ext/resources/css/ext-all.css"); ?>" />
<script type="text/javascript" src="<?php techo("$www_ext/adapter/ext/ext-base.js"); ?>"></script>
<script type="text/javascript" src="<?php techo("$www_ext/ext-all-debug.js"); ?>"></script>
<script type="text/javascript">
Ext.BLANK_IMAGE_URL = '<?php techo("$www_ext/resources/images/default/s.gif"); ?>';
</script>

<script type="text/javascript">
Ext.onReady(function () {

var recordFields = [
	{ name : 'id', mapping : 'id' },
	{ name : 'name', mapping : 'name' },
	{ name : 'f_created', mapping : 'f_created' },
];

var remoteJsonStore = new Ext.data.JsonStore({
	autoDestroy		:	true,
	autoLoad		:	false,
	url				:	'<?php techo("$www_base/admin/json/companies.php"); ?>',
	storeId			:	'ourRemoteStore',
	root			:	'records',
	totalProperty	:	'totalCount',
	remoteSort		:	true,
	fields			:	recordFields,
	idProperty		:	'id',
});

var textFieldEditor = new Ext.form.TextField();

var columnModel = [
	{
		header		:	'Company Name',
		dataIndex	:	'name',
		sortable	:	true,
		editor		:	textFieldEditor,
	},
	{
		header		:	'Created',
		dataIndex	:	'f_created',
		sortable	:	true,
	},
];

var onSave = function () {
	var modified = remoteJsonStore.getModifiedRecords();
	if (modified.length > 0) {
		var recordsToSend = [];
		Ext.each(modified, function (record) {
			recordsToSend.push(record.data);
		});
		
		var grid = Ext.getCmp('myEditorGrid');
		grid.el.mask('Updating', 'x-mask-loading');
		grid.stopEditing();
		
		recordsToSend = Ext.encode(recordsToSend);
		
		Ext.Ajax.request({
			url		:	'<?php techo("$www_base/admin/json/companies.save.php"); ?>',
			params	:	{
				recordsToInsertUpdate	:	recordsToSend,
			},
			success	:	function (response) {
				grid.el.unmask();
				remoteJsonStore.commitChanges();
			},
		});
	}
}

var onRejectChanges = function () {
	remoteJsonStore.rejectChanges();
}

var pagingToolbar = {
	xtype		:	'paging',
	store		:	remoteJsonStore,
	pageSize	:	50,
	displayInfo	:	true,
	items		:	[
		'-',
		{
			text	:	'Save Changes',
			handler	:	onSave,
		},
		'-',
		{
			text	:	'Reject Changes',
			handler	:	onRejectChanges,
		},
		'-',
	],
};

var onInsertRecord = function () {
	var newRecord = new remoteJsonStore.recordType({
		newRecordId		:	Ext.id(),
	});
	
	var grid = Ext.getCmp('myEditorGrid');
	var selectedCell = grid.getSelectionModel().getSelectedCell();
	var selectedRowIndex = selectedCell[0];
	
	remoteJsonStore.insert(selectedRowIndex, newRecord);
	grid.startEditing(selectedRowIndex, 0);
}

var doCellCtxMenu = function (editorGrid, rowIndex, cellIndex, evtObj) {
	evtObj.stopEvent();
	
	if (!editorGrid.rowCtxMenu) {
		editorGrid.rowCtxMenu = new Ext.menu.Menu({
			items	:	[
				{
					text	:	'Insert Record',
					handler	:	onInsertRecord,
				},
// 				{
// 					text	:	'Delete Record',
// 					handler	:	onDeleteRecord,
// 				},
			],
		});
	}
	
	editorGrid.getSelectionModel().select(rowIndex, cellIndex);
	editorGrid.rowCtxMenu.showAt(evtObj.getXY());
}

var grid = {
	xtype		:	'editorgrid',
	columns		:	columnModel,
	id			:	'myEditorGrid',
	store		:	remoteJsonStore,
	loadMask	:	true,
	bbar		:	pagingToolbar,
	stripeRows	:	true,
	viewConfig	:	{
		forceFit	:	true,
	},
	listeners	:	{
		cellcontextmenu		:	doCellCtxMenu,
	},
};

new Ext.Panel({
	height		:	350,
	width		:	550,
	border		:	false,
	renderTo	:	Ext.get('companies'),
	layout		:	'fit',
	items		:	grid,
}).show();

remoteJsonStore.load({
	params		:	{
		start		:	0,
		limit		:	50,
	},
});

});
</script>

<link rel="stylesheet" type="text/css" href="<?php techo("$www_ext/css/site.css"); ?>" />
<style type="text/css">
.centered_div {
	width: 550px;
	margin-left: auto;
	margin-right: auto;
}
</style>
</head>
<body>

<?php $cur_item = 'companies'; include 'menu.php'; ?>

<h1 align="center">Manage Companies</h1>
<div id="companies" class="centered_div"></div>

</body>
</html>

В случае если сервер возвращает «{ success : true }» он делает remoteJsonStore.commitChanges(). Это обновляет все изменённые/добавленные записи в editGrid. Что если сервер смог обновить некоторые записи а некоторые нет (напр. значения для них были не корректными и т.д.). Как сделать commitChanges() только для тех записей которые удалось обновить а для других remoteJsonStore.rejectChanges() ? Или может быть сервер должен вернуть success : false/true для каждой записи в определённом формате что бы это сделалось автоматически? В таком случае в каком формате?

par12b12
()

ls -lh -rw-r--r--+

Форум — Admin

Что значит если ls -lh выводит `+` в конце? Напр.:

# ls -lh
-rw-r--r--  1 spc spc 153M Oct 18 02:19 916.flv
-rw-r--r--+ 1 spc spc 7.9M Oct 17 12:17 94.flv

2-ой файл (с + в конце) не возможно перемотать в flash плеере.

Что значит этот `+` и как убрать/добавить его?

par12b12
()

slashcode - кто нибудь пытался установить это *цензура*?

Форум — Development

Так вот по просьбе начальника занимался этой гадостью (http://www.slashcode.com/) всё утро. Поначалу часа 2 компилилась сотня мелких непонятных пёрл пакетов. Потому начал собирать его самого. Ошибка - ошибочный SQL запрос. Поправил (запятой не хватало между описанием полей в CREATE). После этого всё поставилось вроде с маленькой ошибочкой

Installing...
Error:Slash::Install:/usr/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi/Slash/Install.pm:441:virtuser='slash' -- hostinfo='Localhost via UNIX socket' -- Table 'slash.ajax_ops' doesn't exist -- INSERT INTO ajax_ops VALUES (NULL, 'enable_maker_adless', 'Slash::Achievement', 'ajaxEnableMakerAdless', 'ajax_user', 'createuse')
Which was called by:Slash::Install:/usr/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi/Slash/Install.pm:173
=== (plugin Achievements) Failed on: INSERT INTO ajax_ops VALUES (NULL, 'enable_maker_adless', 'Slash::Achievement', 'ajaxEnableMakerAdless', 'ajax_user', 'createuse'):
Error:Slash::Install:/usr/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi/Slash/Install.pm:441:virtuser='slash' -- hostinfo='Localhost via UNIX socket' -- Table 'slash.ajax_ops' doesn't exist -- INSERT INTO ajax_ops VALUES (NULL, 'dynamic_blocks_delete_message', 'Slash::DynamicBlocks', 'ajaxDeleteMessage', 'ajax_user_static', 'createuse')
Which was called by:Slash::Install:/usr/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi/Slash/Install.pm:173
=== (plugin DynamicBlocks) Failed on: INSERT INTO ajax_ops VALUES (NULL, 'dynamic_blocks_delete_message', 'Slash::DynamicBlocks', 'ajaxDeleteMessage', 'ajax_user_static', 'createuse'):
Use of uninitialized value in pattern match (m//) at /usr/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi/Slash/DB/MySQL.pm line 2689.



You should now have a slashsite!  (Unless serious errors were reported
during the install.  Some plugins do INSERT IGNOREs which may fail and
that is harmless, notably the Search plugin if SOAP is not installed,
which will report that the soap_methods table does not exist.)

Но когда заходишь по домену или по IP сначала браузер пишет «Waiting for <url>». А потом пустая страница. В чём может быть дело.

Они даже в мануале пишут мол забивайте на ошибки. Перловый подход - сотни мелких модулей и что бы всё поставить надо прочитать сотни страниц мануалов и весь исходный код.

par12b12
()

curl_multi_exec help!

Форум — Development

Требуется сделать скрипт (на PHP) что бы брать из MySQL URLs и скачивать их штук по 5 параллельно. Хочу реализовать с помощью curl_multi_*. Но документация настолько скудная что многое неясно. Может кто нибудь объяснить например почему во всех примерах присутствует эта строчка:

while (curl_multi_exec($mh, $active) == CURLM_CALL_MULTI_PERFORM);

Интуитивное представление что это ф-я должна вызываться 1 раз. Напр. сделали curl_multi_add_handle, после этого вызвали это ф-ю что бы этот handler начал скачиваться. И как бы я думал это всё реализовано посредством сигналов для Async I/O. А тут получается что эта ф-я что ли всё делает и её надо регулярно вызывать?

par12b12
()

ffmpeg watermark.so

Форум — Development

Подскажите кто нибудь как сделать что бы добавленное к видео таким образом изображение не было прозрачным.

Сейчас делаю так:

ffmpeg -sameq -i video.mp4 -vhook '/usr/local/lib/vhook/watermark.so -f img.png' out.mp4

где img.png - имеет такой же размер как и видео, в том месте где ничего нет цвет 0x808080 как и описано в ffmpeg-r/vhook/watermark.c.

Вопрос: как сделать что бы watermark была не прозрачной. Посмотрел есть -m 1. Т.е. я думал если написать что то вроде .../watermark.so -f img.png -m 1 -t 010101... и в img.png в местах где нет watermark сделать цвет 0x000000 то получится, но так всё изображение чёрное. Можно ли как то сделать не прозрачный watermark?

И ещё вопрос: результирующий файл получается раза в 2 больше исходного. Наверно какие то другие кодеки используются. А можно ли сделать так что бы все кодеки, и другие параметры полученного в результате файла были такими же как у исходного?

par12b12
()

mod_rewrite help!

Форум — Web-development

Есть каталог, в котором нужно сделать файлы в названии которых есть цифра(ы) недоступными. Поместил в каталог .htaccess со следующим:

RewriteEngine On
RewriteRule \d+ http://<url>

В результате файлы такие как '2.mp3', '3.mp3', 'r2.mp3', 'r3.mp3' перенаправляют на указанный <url>. Однако как ни странно есть 2 файла: '1.mp3' и 'r1.mp3' которые не перенаправляют. Как так? Что делать?

par12b12
()

sox: характеристики аудио

Форум — Development

Добавляю watermark к аудио файлу след. кодом:

`sox -m "|sox $watermark -p pad $pad repeat $repeat trim 0 0:{$min_len['min']}:{$min_len['sec']} vol $vol" $file $out`;

Всё работает, но есть две небольших проблемы:

1. Если $file - stereo track то watermark добавляется только к левому каналу. 2. Громкость результирующего файла уменьшается. Как нормализовать на -3dB?

par12b12
()

sox: добавить watermark

Форум — Development

Есть небольшой файлик, который надо добавлять к аудио файлам, причём он должен повторяться с некоторым интервалом. Как добавить в начало понятно:

sox -m 1.wav 2.mp3 3.mp3

Но как можно сделать так что бы напр. 1.wav повторялся при проигрывании с некоторой паузой X?

par12b12
()

lame: смешать 2 аудио файла в один

Форум — Development

Как можно смешать 2 аудио файла в один с помощью lame желательно. Но если ни как нельзя им тогда чем можно? Платформа естественно LAMP.

par12b12
()

Сделать что бы текст не мог выходить за пределы области

Форум — Web-development

Как можно сделать что бы текст не мог выходить за пределы некоторой области в ширину каким бы длинным он не был, но можно что бы область расширялась вниз. Например, имеется такое:

<div class="quote_body_content">
asdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdf
</div>

и CSS:

.quote_body_content {
	background-color: #FFFFFF;
	font-size: 12px;
	padding: 5px;
	width: 100%;
	height: 100px;
}

Так вот если текст внутри очень длинный без пробелов он выходит за пределы этой области на экране, как показано здесь: http://tinypic.com/view.php?pic=2j28akz&s=6 При этом ещё некоторые элементы ниже уплывают вправо за границы зоны видимости экрана. Очень некрасиво, и так как текст берётся из бд куда вводится юзерами хотелось бы предусмотреть вариант ввода юзером длинного текста без пробелов и избежать такого косяка.

par12b12
()

PHP/MySQL unique record race condition

Форум — Web-development

Положим имеется MySQL таблица:

create table users (
    id bigint unsigned auto_increment primary key,
    username varchar(32) not null,
    password varchar(32) not null
);

И форма для регистрации нового юзера. Естественно username должно быть уникально. Поэтому требуется проверить не существует ли уже юзер с таким username:

if (!isset($_POST['username']) || strlen($_POST['username']) > 32 || strlen($_POST['username']) == 0) {
    $errors[] = "Username cannot be blank / longer than 32 characters";
} else {
    $q = mysql_query(
        "SELECT COUNT(id) AS u_ex FROM users ".
        "WHERE username = '".mysql_real_escape_string($_POST['username'],$db)."'",
        $db
    ) or die("MySQL error: ".mysql_error($db)." on line ".__LINE__);
    $row = mysql_fetch_assoc($q);
    mysql_free_result($q);
    if ($row['u_ex'] != 0) {
        $errors[] = "Username already in use";
    }
}

// ................................
// ....Check other fields..........
// ................................

if (count($errors) == 0) {
    mysql_query(
        "INSERT INTO users SET ".
            "username = '".mysql_real_escape_string($_POST['username'],$db)."',".
            "password = '".mysql_real_escape_string($_POST['password'],$db)."'",
        $db
    ) or die("MySQL error: ".mysql_error($db)." on line ".__LINE__);
}

Однако в этом коде есть подвох. Несмотря на то что он проверяет наличие юзера с таким username («SELECT COUNT(id) AS u_ex....») между этой проверкой и «INSERT INTO users........» теоретически (хотя и маловероятно) параллельно исполняющийся процесс может осуществить проверку и вставить нового юзера с таким username, что в результате приведёт к существованию 2 юзеров с одинаковым username, что совершенно недопустимо. Т.е.:

1. Процесс #1 проверяет наличие юзера с таким username и приходит к выводу что путь свободен.
2. OS scheduler переключает контекст выполнения на другой процесс #2.
3. Процесс #2 проверяет наличие юзера с таким username, приходит к выводу что путь свободен, и успевает вставить юзера.
4. Управление возвращается к процессу #1. Процесс #1 уже проверял наличие юзера username и поэтому просто вставляет юзера с уже вставленным процессом #2 username'ом.

Вопрос как этого избежать.

Конечно можно (и нужно) сделать поле username c параметром UNIQUE (username VARCHAR(32) not null UNIQUE). Это приведёт к ошибке при 2-ом SQL запросе в процессе #1. Можно проверить значение возврата из mysql_query и если оно === FALSE (что сигнализирует об ошибке) выдать сообщение о том что «Username already in use». Однако что если в таблице есть ещё email которое то же должно быть уникальным для каждого юзера. Какую ошибку выдавать в браузер? О том что username используется или что email используется? Да и вообще не красиво это как-то, и теоретически могут возникнуть ошибки с этим не связанные.

Так же можно сделать «LOCK TABLES users WRITE» перед первым запросом. Однако это, насколько я понимаю, плохо для производительности, т.е. неэффективное решение.

Предлагайте варианты решения данной проблемы, желательно с примерами и кодом.

par12b12
()

Аналог плагина Live HTTP Headers для Chromium

Форум — Desktop

Подскажите аналог плагина Live HTTP Headers (это плагин для Mozilla Firefox), но для Chromium. Решил перейти на Chromium потому что mozilla посл. время очень тормозит, особенно когда открыто несколько дней окно, да и так. Chromium вроде быстрей значительно, по крайней мере пока, посмотрим что дальше будет. Live HTTP Headers позволяет посмотреть в отдельном окне HTTP заголовки, полезная вещь для скачки flv видео, с intv.ru например или ещё откуда где ссылки на файл нет.

par12b12
()

Монтирование Sony Ericsson S312 в Gentoo Linux

Форум — Linux-hardware

При подключении телефона SE S312 через USB появляется /dev/sdb, однако смонтировать что бы взять оттуда файлы не получается.

# ls /dev/sd*
/dev/sdb
# mount /dev/sdb /mnt/phone
mount: /dev/sdb: unknown device
#

Плеер, а также другой телефон монтируются нормально, только появляется не только /dev/sdb но и /dev/sdb1.

При загрузке с Gentoo Minimal Installation CD монтируется нормально и передаются файлы. Наверно в ядре нужны какие то дополнительные опции что бы смонтировать этот телефон, только вот какие. Незнаю как определить, в minimal CD до фига драйверов в ядре и как модули.

Ребят, помогите кто знает.

par12b12
()

C++ overloaded operator+ crash

Форум — Development

Такой код:

#include <stdint.h>
#include <unistd.h>

#include <cstdlib>
#include <cstdio>
#include <cstring>

#include <iostream>
using namespace std;

class BinStr {
public:
	uint8_t *data;
	
	BinStr() {
		this->len = 0;
		this->data = NULL;
	}
	
	BinStr(const void *data, size_t len) {
		this->len = len;
		
		this->data = (uint8_t *)malloc(this->len);
		if (this->data == NULL) throw bad_alloc();
		
		memcpy(this->data, data, this->len);
	}
	
	BinStr(const BinStr &obj) {
		this->len = obj.len;
		
		this->data = (uint8_t *)malloc(this->len);
		if (this->data == NULL) throw bad_alloc();
		
		memcpy(this->data, obj.data, this->len);
	}
	
	~BinStr() {
		free(this->data);
	}
	
	size_t size(void) {
		return this->len;
	}
	
	BinStr &operator+=(const BinStr &right) {
		if (this == &right) {
			size_t old_len = this->len;
			this->len *= 2;
			
			this->data = (uint8_t *)realloc(this->data, this->len);
			if (this->data == NULL) throw bad_alloc();
			
			memcpy(this->data + old_len, this->data, old_len);
			
			return *this;
		} else {
			size_t old_len = this->len;
			this->len += right.len;
			
			this->data = (uint8_t *)realloc(this->data, this->len);
			if (this->data == NULL) throw bad_alloc();
			
			memcpy(this->data + old_len, right.data, right.len);
			
			return *this;
		}
	}
	
	const BinStr operator+(const BinStr &right) {
		//return (BinStr(this->data, this->len) += right);
		//return BinStr(*this) += right;

		BinStr ret = *this;
		ret += right;
		return ret;
	}
private:
	size_t len;
};

int main(int argc, char **argv) {
	BinStr b2("hi\x00""5", 4);
	BinStr b3("tell", 4);
	BinStr b4 = BinStr();
	b4 = b3 + b2;
	write(fileno(stdout), b4.data, b4.size());
	
	return 0;
}

выпадает в такой crash dump:

@°î*** glibc detected *** ./a.out: double free or corruption (fasttop): 0x0000000000eeb070 ***
======= Backtrace: =========
/lib/libc.so.6[0x7f3cf6d986c8]
/lib/libc.so.6(cfree+0x76)[0x7f3cf6d9a1d6]
./a.out[0x40103c]
./a.out(__gxx_personality_v0+0x210)[0x400cb0]
/lib/libc.so.6(__libc_start_main+0xe6)[0x7f3cf6d445c6]
./a.out(__gxx_personality_v0+0x59)[0x400af9]
======= Memory map: ========
00400000-00402000 r-xp 00000000 03:03 524302                             /home/user/projects/icq/a.out
00601000-00602000 r--p 00001000 03:03 524302                             /home/user/projects/icq/a.out
*** и т.д. ***

Беда наступает из-за строчки `b4 = b3 + b2;` в main(), если её убрать или хотя бы заменить на `b3 + b2;`, т.е. без присваивания переменной, crash не происходит.

Насколько я понял из чтения дампа и отладки в дебагере, на каком то объекте destructor вызывается дважды (скорее всего на том который создаётся внутри operator+ т.е. ret).

Внимание вопрос!

Что я делаю не так? Как с этим бороться? Во всех туториалах которые удалось найти в гугле operator+ показывается именно так как у меня, перепробовал множество вариантов (закомментированы), безрезультатно. А может дело то и не в operator+ совсем а в например copy constructor'е.

Вобщем help!!!!

par12b12
()

RSS подписка на новые темы