小编Orw*_*ell的帖子

Delphi应用程序泄漏AnsiStrings

根据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)

memory delphi string memory-leaks dev-c++

11
推荐指数
1
解决办法
3661
查看次数

允许GCC makefile目标中的空间

有没有办法在使用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",但每次每个单词都会进行链接.

gcc mingw makefile space target

8
推荐指数
1
解决办法
4899
查看次数

Delphi在异常后获取堆栈跟踪

我试图弄清楚如何在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上的人已经这样做了,但我想知道它是如何完成的.

delphi exception stack-trace

8
推荐指数
2
解决办法
1万
查看次数

始终在TValueListEditor中显示选项下拉列表

我正在尝试通过减少执行某些操作所需的点击次数来改进GUI.但是,困扰我的一个VCL组件是TValueListEditor,它包含一个键和值列表,所有这些都由下拉列表控制.选择选项始终需要三次点击,只需要两次:

坏

此时,最上面的行具有焦点,可以使用下拉列表(两次单击)更改值.但是,当用户想要编辑不同的密钥时,他首先必须将焦点更改为该密钥才能使用下拉列表(三次单击).

有没有办法在所有行上显示下拉箭头以防止额外的点击?

这是我想要实现的模型示例:

好

delphi user-interface delphi-7

6
推荐指数
1
解决办法
2382
查看次数

在Delphi程序中使用Ctrl + /作为快捷方式

这甚至可能吗?例如,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)

delphi shortcut delphi-7

6
推荐指数
2
解决办法
3656
查看次数

在Dev c ++中运行项目

我有一个文件夹,其中包含一些.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:没有这样的文件或目录.

c++ makefile dev-c++

5
推荐指数
1
解决办法
2万
查看次数

TLanguages实用程序中的Delphi访问冲突

出于某种原因,尝试通过使用单例或通过直接调用构造函数来创建由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)

delphi locale delphi-7

5
推荐指数
1
解决办法
407
查看次数

为什么迭代一个对象列表比迭代一个对象指针列表慢?

阅读此博客文章后,列表对缓存的不友好程度如下: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)

c++ pointers list

5
推荐指数
1
解决办法
521
查看次数

MATLAB parfor广播变量的值不正确

在这个最小的可执行代码段中:

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.

matlab broadcast parfor

3
推荐指数
1
解决办法
127
查看次数

编译后停止和仅检查语法之间的区别

当使用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)

c c++ gcc g++ syntax-checking

2
推荐指数
1
解决办法
419
查看次数