在C或C++应用程序中发生内存泄漏是否可以接受?
如果您分配一些内存并使用它直到应用程序中最后一行代码(例如,全局对象的析构函数),该怎么办?只要内存消耗不会随着时间的推移而增长,当您的应用程序终止时(在Windows,Mac和Linux上),是否可以信任操作系统为您释放内存?如果内存被连续使用直到它被操作系统释放,你甚至会认为这是一个真正的内存泄漏.
如果第三方图书馆强迫你这样做怎么办?拒绝使用第三方图书馆,无论它有多么伟大?
我只看到一个实际的缺点,那就是这些良性泄漏会将内存泄漏检测工具显示为误报.
在Javascript中,如何在不绑定this
参数的情况下将参数绑定到函数?
例如:
//Example function.
var c = function(a, b, c, callback) {};
//Bind values 1, 2, and 3 to a, b, and c, leave callback unbound.
var b = c.bind(null, 1, 2, 3); //How can I do this without binding scope?
Run Code Online (Sandbox Code Playgroud)
如何避免必须绑定函数范围的副作用(例如setting this
= null)?
编辑:
对困惑感到抱歉.我想绑定参数,然后能够稍后调用绑定函数并使其行为与我调用原始函数并将其传递给绑定参数完全相同:
var x = 'outside object';
var obj = {
x: 'inside object',
c: function(a, b, c, callback) {
console.log(this.x);
}
};
var b = obj.c.bind(null, 1, 2, 3);
//These should both …
Run Code Online (Sandbox Code Playgroud) 我有几百万个数字的数组.
double* const data = new double (3600000);
Run Code Online (Sandbox Code Playgroud)
我需要迭代数组并找到范围(数组中的最大值减去最小值).然而,有一个问题.我只想找到最小值和最大值在1000个样本之间的范围.
所以我需要找到最大值:范围(数据+ 0,数据+ 1000),范围(数据+ 1,数据+ 1001),范围(数据+ 2,数据+ 1002),....,范围(数据) + 3599000,数据+ 3600000).
我希望这是有道理的.基本上我可以像上面那样做,但我正在寻找一个更有效的算法,如果存在的话.我认为上面的算法是O(n),但我觉得可以优化.我正在玩的一个想法是跟踪最近的最大值和最小值以及它们的返回距离,然后在必要时才回溯.
我将用C++编写它,但伪代码中的一个很好的算法就可以了.另外,如果我想找的这个号码有一个名字,我很想知道它是什么.
谢谢.
我正在使用GCC; __FILE__返回当前源文件的完整路径和名称:/path/to/file.cpp
.有没有办法file.cpp
在编译时获取文件的名称(没有它的路径)?是否可以以便携方式执行此操作?模板元编程可以应用于字符串吗?
我在错误记录宏中使用它.我真的不希望我的源代码完整路径进入可执行文件.
假设我有两个数组:
int ArrayA [] = {5,17,150,230,285};
int ArrayB [] = {7,11,57,110,230,250};
两个数组都是排序的,可以是任何大小.我正在寻找一种有效的算法来查找数组是否包含它们之间的任何重复元素.我只想要一个真/假答案,我不关心共享哪个元素或多少元素.
天真的解决方案是循环遍历ArrayA中的每个项目,并在ArrayB中对其进行二进制搜索.我相信这种复杂性是O(m*log n).
因为两个数组都是排序的,所以似乎应该有一个更有效的算法.
我还想要一个通用的解决方案,它不假设数组包含数字(即解决方案也适用于字符串).但是,比较运算符定义良好,两个数组都从最小到最大排序.
我正在寻找一种有效的算法,用于将一组字母加扰成包含最大字数的排列.
例如,假设给出了字母列表:{e,e,h,r,s,t}.我需要以包含最大字数的方式对它们进行排序.如果我将这些字母命名为"theres",它包含"the","there","her","here"和"ere"等字样.因此,该示例的得分为5,因为它包含5个单词.我想以这样的方式订购这些字母以获得最高分(包含最多的单词).
一个天真的算法是尝试对每个排列进行评分.我相信这是O(n!),因此仅针对上面的6个字母尝试720种不同的排列(包括一些重复,因为该示例有两次).当然,对于更多的字母,天真的解决方案很快就变得不可能了.
该算法不必实际产生最佳解决方案,但它应该在合理的时间内找到一个好的解决方案.对于我的应用程序,简单地猜测(蒙特卡罗)几百万的排列效果非常差,所以这是目前的标志.
我目前正在使用Aho-Corasick算法对排列进行评分.它只通过文本一次搜索字典中的每个单词,所以我相信它非常有效.这也意味着我将所有单词存储在一个trie中,但如果另一个算法需要不同的存储空间也很好.我并不担心设置字典,只是实际订购和搜索的运行时间.如果需要,甚至可以使用模糊字典,例如布隆过滤器.
对于我的应用程序,给出的字母列表大约为100,字典包含超过100,000个条目.字典永远不会改变,但需要订购几个不同的字母列表.
我正在考虑尝试寻路算法.我相信我可以从列表中的随机字母开始作为起点.然后,每个剩余的字母将用于创建"路径".我认为这适用于Aho-Corasick评分算法,因为分数可以一次建立一个字母.我还没有尝试寻路; 也许这不是一个好主意?我不知道哪种路径寻找算法可能是最好的.
我想到的另一种算法也是以随机字母开头的.然后将搜索字典trie以查找包含剩余字母的"丰富"分支.包含不可用字母的字典分支将被修剪.关于这将如何正常工作的细节我有点模糊,但它可以完全消除评分排列.
在C++中,派生类如何以有意义的方式覆盖基类相等性测试?
例如,假设我有一个基类A.类B和C派生自A.现在给出两个指向两个A对象的指针,我可以测试它们是否相等(包括任何子类数据)吗?
class A {
public: int data;
};
class B : public A {
public: float more_data; bool something_else;
};
class C : public A {
public: double more_data;
};
A* one = new B;
A* two = new B;
A* three = new C;
//How can I test if one, two, or three are equal
//including any derived class data?
Run Code Online (Sandbox Code Playgroud)
这样做有干净的方法吗?什么是我最好的选择?
谢谢!
我在确定const在特定情况下的确切应用方式时遇到了一些麻烦.这是我的代码:
struct Widget
{
Widget():x(0), y(0), z(0){}
int x, y, z;
};
struct WidgetHolder //Just a simple struct to hold four Widgets.
{
WidgetHolder(Widget a, Widget b, Widget c, Widget d): A(a), B(b), C(c), D(d){}
Widget& A;
Widget& B;
Widget& C;
Widget& D;
};
class Test //This class uses four widgets internally, and must provide access to them externally.
{
public:
const WidgetHolder AccessWidgets() const
{
//This should return our four widgets, but I don't want anyone messing with them. …
Run Code Online (Sandbox Code Playgroud) 假设我有两个项目,a和b,比较相同.所以a <b是假的,b <a是假的.如果将这些项作为键插入到std :: multiset(或std :: multimap)中,我是否对其最终排序顺序有任何保证?
我查了几个参考文献,但我找不到答案.我很想认为没有任何保证,并且它由每个特定的实现决定.
谢谢.
我正在尝试包装一些遗留的C代码,以便与在.NET Core上运行的C#一起使用.我正在使用这里给出的方法来创建一个编译为纯MSIL的C++包装器.它适用于简单的函数,但我发现如果我的代码使用指针指针或指针数组,它会因内存违规而崩溃.它经常崩溃Visual Studio,我必须重新启动所有东西,这是乏味的.
例如,以下代码将导致崩溃:
public ref class example
{
public:
static void test() {
Console::WriteLine("\nTesting pointers.");
double a[5] = {5,6,7,8,9}; //Array.
double *b = a; //Pointer to first element in array.
Console::WriteLine("\nTesting bare pointers.");
Console::WriteLine(a[0]); //Prints 5.
Console::WriteLine(b[0]); //Prints 5.
Console::WriteLine("\nTesting pointer-to-pointer.");
double **c = &b;
Console::WriteLine(c == &b); //Prints true.
Console::WriteLine(b[0]); //Works, prints 5.
Console::WriteLine(**c); //Crashes with memory access violation.
Console::WriteLine("\nTesting array of pointers.");
double* d[1];
d[0] = b;
Console::WriteLine(d[0] == b); //Prints false???
Console::WriteLine(b[0]); //Works, prints …
Run Code Online (Sandbox Code Playgroud) c++ ×6
algorithm ×3
c ×2
.net ×1
c# ×1
c++-cli ×1
cil ×1
clr ×1
const ×1
equality ×1
inheritance ×1
javascript ×1
macros ×1
makefile ×1
memory-leaks ×1
operators ×1
statistics ×1
stl ×1