我试图在C中编写一个字符串替换函数,它在a上工作char *,已经使用了malloc().它有点不同,它会找到并替换字符串,而不是起始字符串中的字符.
如果搜索和替换字符串的长度相同(或者替换字符串比搜索字符串短),这很简单,因为我有足够的空间分配.如果我尝试使用realloc(),我会收到一个错误,告诉我我正在做双重免费 - 我不知道我是怎么回事,因为我只是在使用realloc().
也许一点点代码会有所帮助:
void strrep(char *input, char *search, char *replace) {
int searchLen = strlen(search);
int replaceLen = strlen(replace);
int delta = replaceLen - searchLen;
char *find = input;
while (find = strstr(find, search)) {
if (delta > 0) {
realloc(input, strlen(input) + delta);
find = strstr(input, search);
}
memmove(find + replaceLen, find + searchLen, strlen(input) - (find - input));
memmove(find, replace, replaceLen);
}
}
Run Code Online (Sandbox Code Playgroud)
该程序有效,直到我尝试realloc()在被替换的字符串将比初始字符串长的实例中.(它仍然有点工作,它只是吐出错误以及结果).
如果有帮助,调用代码如下所示: …
我认为这char* = "string"是相同的char* = new char[6].我相信这些字符串是在堆而不是堆栈上创建的.因此,当我使用它们或者它们被自己摧毁时,我是需要销毁它们还是释放它们的记忆?
我有一个1GB的XML文件,想要解析它.如果我使用XML Textreader或XMLDocument,结果很慢,有时会挂起......
标准中"似乎"这个短语的确切含义是什么?当用户可以修改行为的各个部分时,它是如何工作的.
在讨论nothrow版本时,问题是关于C++标准operator new.18.4.1.1/7读(我的重点):
这个nothrow版本的operator new返回一个获得的指针,好像从普通版本获得的一样.
我的理解是,只要行为合适,"似乎"就不需要特定的实现.所以,如果operator new像这样实现(我知道这不是一个兼容的实现,因为没有循环或使用new_handler;但我正在缩短它以专注于我的问题):
// NOTE - not fully compliant - for illustration purposes only.
void *operator new(std::size_t s)
{
void *p = malloc(s);
if (p == 0)
throw std::bad_alloc();
return p;
}
Run Code Online (Sandbox Code Playgroud)
那么写下这样的nothrow版本是合法的:
// NOTE - not fully compliant - for illustration purposes only.
void *operator new(std::size_t s, const std::nothrow_t &nt)
{
return malloc(s);
}
Run Code Online (Sandbox Code Playgroud)
但是,假设程序替换operator new为使用其他分配器."似乎"意味着编译器必须自动更改nothrow版本的行为才能使用其他分配器吗?开发人员是否需要更换普通版本和非版本版本?
根据我的研究,我学到了以下内容:
TaskScheduler.UnobservedTaskException必须等待该任务被垃圾收集,然后该任务的未被观察到的异常将冒泡到该UnobservedTaskException事件.Task.Wait()它,它永远不会被调用,因为你正在阻止来自Task的即将发生的结果,因此异常将被抛出Task.Wait()而不是冒泡到UnobservedException事件.GC.Collect()手动调用通常是一个坏主意,除非你确切地知道你正在做什么,因此在这种情况下确认事情是好的,但不能作为问题的正确解决方案.问题
如果我的应用程序在垃圾收集器启动之前退出,我绝对100%无法UnobservedTaskException触发我的事件.
请注意以下代码:
class Program
{
static void Main(string[] args)
{
TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException;
Task.Factory.StartNew(() =>
{
Console.WriteLine("Task started.");
throw new Exception("Test Exception");
});
Thread.Sleep(1000);
//GC.Collect();
//GC.WaitForPendingFinalizers();
}
static void TaskScheduler_UnobservedTaskException(object sender, UnobservedTaskExceptionEventArgs e)
{
File.WriteAllText(@"C:\data\TestException.txt", e.Exception.ToString());
Console.WriteLine("UNOBSERVED EXCEPTION");
}
}
Run Code Online (Sandbox Code Playgroud)
没有写入异常文件,也没有任何内容写入控制台.在应用程序退出后10-15分钟甚至更长时间可以继续,但我仍然看不到我的应用程序的遗骸被垃圾收集的证据.您可能会问,为什么不在退出时收集?好吧,我的真实场景是我的异常陷阱在Windows服务中托管的WCF服务内运行.当Windows服务关闭(因此手动调用GC.Collect())时,我无法陷阱,因为就我所见,没有任何事件.
我哪里错了?我如何确保如果WCF服务内部的某些内容最终会破坏我的Windows服务,那么我有机会在服务崩溃之前记录异常?
如何从本机Win32应用程序中选择现有文件夹(或创建新文件夹)?
这是一个类似的问题.它对C#/ .NET有很好的答案.但是我希望原生Win32能做同样的事情.
有人知道解决方案,免费代码等吗?
更新:
我从答案中尝试了这个功能.除了必须调用SHGetPathFromIDList函数来检索所选目录的名称之外,所有内容都按预期工作.这是一个示例屏幕截图:

假设Date可以为null DateTime:
Mapper.CreateMap<SomeViewModels, SomeDTO>()
.ForMember(dest => dest.Date,
opt => opt.MapFrom(src =>
{
DateTime? finalDate = null;
if (src.HasDate == "N")
{
// so it should be null
}
else
{
endResult = DateTime.Parse(src.Date.ToString());
}
return finalDate;
}));
Run Code Online (Sandbox Code Playgroud)
我得到的错误是:"错误30带有语句体的lambda表达式无法转换为表达式树."
当然,我完全清楚我可以简化查询,例如:
Mapper.CreateMap<SomeViewModels, SomeDTO>()
.ForMember(dest => dest.Date,
opt => opt.MapFrom(src => src.HasDate == "N" ? null : DateTime.Parse(src.Date.ToString())));
Run Code Online (Sandbox Code Playgroud)
但是,如果我坚持保留第一个例子的结构,因为我有更复杂的if else语句,第二个例子无法满足或至少不具有可读性,该怎么办?
我有几个头文件,归结为:
tree.h中:
#include "element.h"
typedef struct tree_
{
struct *tree_ first_child;
struct *tree_ next_sibling;
int tag;
element *obj;
....
} tree;
Run Code Online (Sandbox Code Playgroud)
和element.h:
#include "tree.h"
typedef struct element_
{
tree *tree_parent;
char *name;
...
} element;
Run Code Online (Sandbox Code Playgroud)
问题是它们都相互引用,因此树需要包含元素,元素需要包含树.
这不起作用,因为要定义"树"结构,元素结构必须已知,但要定义元素结构,必须知道树结构.
如何解决这些类型的循环(我认为这可能与'前向声明'有关?)?
我有一个struct包含两个列表:
struct MonthData
{
public List<DataRow> Frontline;
public List<DataRow> Leadership;
}
Run Code Online (Sandbox Code Playgroud)
但是,我想在创建结构时初始化它们.如果我尝试:
struct MonthData
{
public List<DataRow> Frontline = new List<DataRow>();
public List<DataRow> Leadership = new List<DataRow>();
}
Run Code Online (Sandbox Code Playgroud)
然后我得到:
Error 23 'MonthData.Frontline': cannot have instance field initializers in structs
...
Run Code Online (Sandbox Code Playgroud)
由于结构不能有无参数构造函数,我不能只在构造函数中设置它.到目前为止,我只能看到以下选项:
推荐的方法是什么?现在,我在想这个课程是最好的主意.
在Windows上,我可以这样做:
HANDLE hCurrentProcess = GetCurrentProcess();
SetPriorityClass(hCurrentProcess, ABOVE_NORMAL_PRIORITY_CLASS);
Run Code Online (Sandbox Code Playgroud)
我怎么能在*nix上做同样的事情?