根据FastMM4,我正在研究的Delphi程序正在泄漏很多字符串.确切地说,AnsiStrings:

应用程序(http://sourceforge.net/projects/orwelldevcpp/)曾经泄漏了更多其他数据类型,但FastMM4可以报告实例的创建位置,因此我设法解决了这个问题.奇怪的是,FastMM4根本不报告这些泄漏的位置.
编辑:它似乎确实存在,看到修复的答案.无论如何,问题仍然存在:我在世界上如何泄漏这些东西?
所以,嗯,不幸的是,我不知道该寻找什么.我的意思是,如果这些东西超出范围,它们应该自动释放(即使它们在堆上)?
我确实设法通过随机评论跟踪一些泄漏事件并查看计数会发生什么.这是一个例子:
// simply passing it a constant creates a leak...
MainForm.UpdateSplash('Creating extra dialogs...');
procedure TMainForm.UpdateSplash(const text : AnsiString);
begin
if not devData.NoSplashScreen then // even if this branch is NOT taken
SplashForm.Statusbar.SimpleText := 'blablabla' + text;
end;
// And even if the function call itself is placed within a NOT taken branch!
Run Code Online (Sandbox Code Playgroud)
这是泄漏的另一个例子:
// Passing this constants produces leaks...
procedure TCodeInsList.AddItemByValues(const a, b, c: AnsiString;...);
var
assembleditem : PCodeIns;
begin
new(assembleditem);
assembleditem^.Caption:=a;
assembleditem^.Line:=b;
assembleditem^.Desc:=c; …Run Code Online (Sandbox Code Playgroud) 有没有办法在使用make.exe时在目标名称中获取空间?如果这个真正古老的错误报告是正确的,似乎是不可能的:http: //savannah.gnu.org/bugs/?712
作为参考,最大的问题是makefile命令如下:
"foo bar baz": $(OBJ)
$(CPP) $(LINKOBJ) -o $(BIN) $(LIBS)
Run Code Online (Sandbox Code Playgroud)
...似乎被视为三个独立的命令:一个用于构建"foo(注意包含"),一个用于构建条形图,最后一个用于构建baz"(再次,包括").这是因为make.exe似乎使用空格作为分隔符.
但是,假设人们可能想要构建"Hello World.exe"是合理的.这似乎不可能.双引号不起作用,也没有逃避单独的单词(我在某处读过,不记得链接):
"foo\\ bar\\ baz": $(OBJ)
$(CPP) $(LINKOBJ) -o $(BIN) $(LIBS)
Run Code Online (Sandbox Code Playgroud)
有没有其他方法来解决这个问题?官方手册仅确认按空格标记的内容,但不提供将空间用于任何其他目的的方法:http: //www.gnu.org/software/make/manual/make.html#Rule-句法
编辑:按照建议,我也尝试过单斜线,但这些效果与双斜线完全相同.抱怨它无法找到第一个单词的规则:
mingw32-make.exe: *** No rule to make target `foo', needed by `all'. Stop.
Run Code Online (Sandbox Code Playgroud)
虽然可以正确生成可执行文件"foo bar baz.exe",但每次每个单词都会进行链接.
我试图弄清楚如何在Delphi中抛出异常后获取堆栈跟踪.但是,当我尝试使用下面的函数在Application.OnException事件中读取堆栈时,堆栈似乎已被刷新并被抛出过程替换.
function GetStackReport: AnsiString;
var
retaddr, walker: ^pointer;
begin
// ...
// History of stack, ignore esp frame
asm
mov walker, ebp
end;
// assume return address is present above ebp
while Cardinal(walker^) <> 0 do begin
retaddr := walker;
Inc(retaddr);
result := result + AddressInfo(Cardinal(retaddr^));
walker := walker^;
end;
end;
Run Code Online (Sandbox Code Playgroud)
这是我得到的结果:
001A63E3: TApplication.HandleException (Forms)
00129072: StdWndProc (Classes)
001A60B0: TApplication.ProcessMessage (Forms)
Run Code Online (Sandbox Code Playgroud)
这显然不是我想要的,虽然它是正确的.我想在抛出异常之前检索堆栈,或者换句话说,之前(之后也会执行)OnException调用的内容.
有没有办法做到这一点?
我知道我正在重新发明轮子,因为在madExcept/Eurekalog/jclDebug上的人已经这样做了,但我想知道它是如何完成的.
我正在尝试通过减少执行某些操作所需的点击次数来改进GUI.但是,困扰我的一个VCL组件是TValueListEditor,它包含一个键和值列表,所有这些都由下拉列表控制.选择选项始终需要三次点击,只需要两次:

此时,最上面的行具有焦点,可以使用下拉列表(两次单击)更改值.但是,当用户想要编辑不同的密钥时,他首先必须将焦点更改为该密钥才能使用下拉列表(三次单击).
有没有办法在所有行上显示下拉箭头以防止额外的点击?
这是我想要实现的模型示例:

这甚至可能吗?例如,Notepad ++可以实现,但只是尝试将其分配给操作或菜单项等组件不起作用.它被分配的事件根本不会触发.
所以,我把我的问题提交给谷歌.纳达.然后,我尝试逐步执行各种快捷方式功能,在本例中为TextToShortCut和ShortCutToText.
第一个,TextToShortCut,将"Ctrl + A"(字符串)等内容转换为以下16位值:
(uint)A | (uint)Ctrl
Run Code Online (Sandbox Code Playgroud)
大多数工作正常.但是,我观察到以下奇怪之处:
// Try converting back and forward...
TextToShortCut('Ctrl+/') = 16495
// That's incorrect. It should be:
Ord('/') or scCtrl = 16431
// Incorrect too
ShortCutToText(16495) = 'Ctrl+/'
// This is the shortcut the first line actually creates (Ctrl+o)
Ord('o') or scCtrl = 16495 // wut?
// Which is invalid, cause only caps are used
ShortCutToText(16431) = ''
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?现在,我认为错误在于TextToShortCut的最后部分:在处理+符号之前的部分(在本例中为"Ctrl")之后,它将尝试找到剩余部分("/")的快捷方式.但是,在其当前形式中,+之后的部分也必须是它自己的有效快捷方式.
for Key := $08 to $255 do { Copy range from table …Run Code Online (Sandbox Code Playgroud) 我有一个文件夹,其中包含一些.h和.cpp文件以及一个makefile.如何在开发C++中运行它们.我刚开始使用dev C++,因此对此有点无能为力.make文件是
CC=g++
CV=-I/usr/include/opencv
CV2=-lml -lcvaux -lhighgui -lcv -lcxcore
all:
$(CC) main.cpp HOG.cpp HOGFeaturesOfBlock.cpp $(CV) $(CV2) -o featureExtractor
Run Code Online (Sandbox Code Playgroud)
我收到错误main.cpp,hog.cpp:没有这样的文件或目录.
出于某种原因,尝试通过使用单例或通过直接调用构造函数来创建由SysUtils头提供的TLanguages对象在野外引起麻烦,其中一些用户报告此错误(X变化):
Access violation at address X. Write of address X (at address X)
Run Code Online (Sandbox Code Playgroud)
......当执行以下看似无辜的代码行时:
TLanguages.Create;
Run Code Online (Sandbox Code Playgroud)
澄清一下,这与背景无关.我可以把这行放在我喜欢的任何地方(例如,作为空程序的唯一代码行),但问题仍然存在.
奇怪的是,这个类是Delphi标准头文件的一部分,它不应该失败(对吧?).
constructor TLanguages.Create;
type
TCallbackThunk = packed record
POPEDX: Byte;
MOVEAX: Byte;
SelfPtr: Pointer;
PUSHEAX: Byte;
PUSHEDX: Byte;
JMP: Byte;
JmpOffset: Integer;
end;
var
Callback: TCallbackThunk;
begin
inherited Create;
Callback.POPEDX := $5A;
Callback.MOVEAX := $B8;
Callback.SelfPtr := Self;
Callback.PUSHEAX := $50;
Callback.PUSHEDX := $52;
Callback.JMP := $E9;
Callback.JmpOffset := Integer(@TLanguages.LocalesCallback) - Integer(@Callback.JMP) - 5;
EnumSystemLocales(TFNLocaleEnumProc(@Callback), LCID_SUPPORTED);
end;
Run Code Online (Sandbox Code Playgroud)
构造函数尝试使用成员函数作为EnumSystemLocales回调,这似乎导致崩溃,因为将TLanguages.LocalesCallback函数复制到全局作用域并将其传递给EnumSystemLocales非常正常.
该结构包含以下Intel x86程序集,其中每个项目由其操作码给出:
pop edx …Run Code Online (Sandbox Code Playgroud) 阅读此博客文章后,列表对缓存的不友好程度如下:http: //www.baptiste-wicht.com/2012/11/cpp-benchmark-vector-vs-list/
...我试图通过将实际对象放入每个节点(从而删除一个间接操作)来创建std ::指向对象的指针更多缓存友好列表,希望当当前节点被缓存时,对象也将是.但是,性能实际上下降了.这是我使用的代码:
来源和二进制文件: http ://wilcobrouwer.nl/bestanden/ListTest%202013-8-15%20%233.7z
#include <list>
using std::list;
list<Object*> case1;
list<Object> case2;
class Object {
public:
Object(char i);
~Object();
char dump[256];
};
// Should not notice much of a difference here, equal amounts of memory are
// allocated
void Insertion(Test* test) {
// create object, copy pointer
float start1 = clock->GetTimeSec();
for(int i = 0;i < test->size;i++) {
case1.push_back(new Object(i));
}
test->insertion1 = clock->GetTimeSec()-start1;
// create object in place, no temps on stack
float …Run Code Online (Sandbox Code Playgroud) 在这个最小的可执行代码段中:
a = [];
workers = parpool('local',4);
someboolean = false;
parfor i = 1:4
if someboolean % broadcast variable
b = a(i); % ERROR
else
b = 0;
end
end
Run Code Online (Sandbox Code Playgroud)
... someboolean的值为'true',执行无效行导致以下错误:
使用bugscript时出错(第4行)
索引超出了矩阵维度.
行号指的是最后一条非平行线,如果 b = a(i)删除了赋值,则错误消失.
我无法在互联网上找到遭受同样问题的其他人.谁能解释一下发生了什么?我正在使用MATLAB R2015a.
当使用gcc或g ++时,告诉GCC只编译文件而不是链接(-S),并告诉它不生成输出文件(-o"nul")之间有什么区别:
gcc.exe/g++.exe -S "filename" -o "nul"
Run Code Online (Sandbox Code Playgroud)
...并告诉它只检查语法(-fsyntax-only)?
gcc.exe/g++.exe -c "filename" -fsyntax-only
Run Code Online (Sandbox Code Playgroud)
这两个选项都不会产生输出,只运行编译阶段,并且需要大约相同的时间才能运行.
我正在使用GCC的Windows端口,它将"nul"视为占用所有输出的空设备(如/ dev/null).
编辑:正如Mike Seymour所指出的,当将-fsyntax-only传递给GCC时,即使被告知这样做也不会尝试执行优化,这与-S不同.换句话说,这是较慢的(我已经执行了测量):
gcc.exe -S "filename" -o "nul" -O3
Run Code Online (Sandbox Code Playgroud)
... 比这个:
gcc.exe -c "filename" -fsyntax-only -O3
Run Code Online (Sandbox Code Playgroud)