我有一个结构malloc()'d,在使用它们之后,我想释放()它,但我的程序冻结在这里.谁能告诉我,我做错了什么?
这是我的代码:
struct data
{
char *filename;
char *size;
};
//primarypcs is a long type variable
struct data *primary = (struct data *)malloc( primarypcs * sizeof( struct data ) );
memset( primary, 0, sizeof(struct data *) * primarypcs );
...
...
...
for ( i = 0; i < primarypcs; i++ )
{
free( primary[i].filename ); //<----my program freezes here
free( primary[i].size ); //<----or here
}
free( primary );
Run Code Online (Sandbox Code Playgroud)
提前致谢!
kampi
编辑:
我如何正确malloc内存的文件名和大小?
EDIT2:
对不起,但我很着急,我没有告诉你所有你需要的信息.现在让我这样做:)基本上,我想创建一个应用程序,它获取两个给定驱动器/文件夹的文件列表,然后比较它们.我想(并且仍然这样),最简单的方法是,当我将文件名及其大小存储在如上所述的结构中时.所以我必须动态分配内存(我认为这就是他们所说的)文件名和大小以及结构的内容.
malloc和new在处理内存分配的各自机制方面有什么区别?
它是否真的适用于某些编译器/机器,但在其他编译器/机器上它会导致堆损坏和崩溃?
有没有人对隐藏的内容有什么了解?
这是一个简单的问题:
使用new运算符是否返回类型指针(void*)?请参阅new/delete和malloc/free之间的区别是什么?答案 - 它说new returns a fully typed pointer while malloc void *
但根据http://www.cplusplus.com/reference/new/operator%20new/
throwing (1)
void* operator new (std::size_t size) throw (std::bad_alloc);
nothrow (2)
void* operator new (std::size_t size, const std::nothrow_t& nothrow_value) throw();
placement (3)
void* operator new (std::size_t size, void* ptr) throw();
Run Code Online (Sandbox Code Playgroud)
这意味着它返回一个类型为(void*)的指针,如果它返回(void*)我从未见过像MyClass*ptr =(MyClass*)new MyClass这样的代码;
我很困惑.
编辑
根据http://www.cplusplus.com/reference/new/operator%20new/ example
std::cout << "1: ";
MyClass * p1 = new MyClass;
// allocates memory by calling: operator new (sizeof(MyClass))
// and then constructs an object …Run Code Online (Sandbox Code Playgroud) 我正在调试一个在低内存情况下失败的程序,并希望C++程序只消耗大量内存.任何指针都会有所帮助!
我通常用c ++编程,但是我的char*使用了一些clibrary函数.一些像'getline'这样的联机帮助页说,输入应该是一个malloced数组.
可以,使用'new'代替吗?
我可以看到我的小样本它可以工作,但这可能在某些时候会导致一些奇怪的未定义行为?
我知道'new'应该与'delete'匹配,'malloc'与'free'匹配.
我也没有使用std :: string.这是故意的.
谢谢
大家好我是c ++的菜鸟,想知道是否
memblock = (char *)malloc( currentByteLength);
Run Code Online (Sandbox Code Playgroud)
相当于
memblock = new char[currentByteLength]
Run Code Online (Sandbox Code Playgroud)
在c ++中.
我想在不考虑底层结构是数组的情况下概括C++中的按位运算符.
例如......如果我想代表86位,我将使用结构结构/类,如:
typedef struct {
uint64_t x[1];
uint16_t y[1];
uint8_t z[1];
} sampleStruct;
Run Code Online (Sandbox Code Playgroud)
相反,如果我想分配160位,我会使用如下结构:
typedef struct {
uint64_t x[2];
uint32_t y[1];
} sampleStruct;
Run Code Online (Sandbox Code Playgroud)
我认为存储的一个微不足道但不是最优的解决方案是假设所有块都是统一的并且分配最小值,它覆盖我正在实现的大小,但是即使是练习,我更喜欢我暴露的方式.
对我而言,听起来我应该使用元编程来解决问题,所以我必须正确定义
template <int I>
typedef sampleStruct {
//something
}
Run Code Online (Sandbox Code Playgroud)
但是我不是C++模板元编程的大专家,所以我想了解实现不同类型的示例struct变量的最佳方法.我知道如何为我的长度决定最好的"封面"是这样的:
N64 = I/64;
RemN = I%64;
if(0 < RemN <= 8) {
add uint8_t var;
} else if (8 < RemN <= 16) {
add uint16_t var;
} else if (16 < RemN <= 24) {
add uint16_t var;
add uint8_t var;
} else {
//Similarly …Run Code Online (Sandbox Code Playgroud) 我即将参加C++考试.但我只得到一个裂缝,超过85%.如果我不推翻那个,那我就没有得到这份工作.
这些测试的问题在于它们通常以通用C++为目标,并且根据您使用的库,您的泛型定义可能会有所不同.STL和Boost对某些人来说似乎是合乎逻辑的(并且应该是大多数人的一部分)但是我在使用模板之前已经与MFC合作多年.当您有权访问CArray时,为什么要使用> vector>?(修辞问题)
如果您使用过对话框,则表示您没有使用过stdio.如果您使用过Borland产品,那么您就没有使用过MFC.如果您使用过Palm,那么您还没有使用过文件系统,而且您肯定没有使用过CFile.
好的,所以这是问题......
鉴于我想通过85%,我正在进行"通用"C++的在线测试.那么...... 有没有可以去寻找测试的地方? 越多越好.在测试期间或之后,正确的答案也是好的.只要我能从错误中吸取教训.
编辑:如果你的答案没有测试的链接,一些C++问题,或一些面试问题...你错过了我可以去寻找测试的地方吗?
很好的例子..我刚刚发现了这个问题.
以下代码片段打印什么? cout << setw(6) << setfill('#') << "Hello";
我已经编码了9年.并且从未使用过cout,setw或setfill曾经.不是大学毕业.
为什么它不能只是常规函数调用?新的本质上是:
malloc(sizeof(Foo));
Foo::Foo();
Run Code Online (Sandbox Code Playgroud)
删除是
Foo:~Foo();
free(...);
Run Code Online (Sandbox Code Playgroud)
那么为什么new/delete最终会拥有自己的语法而不是常规函数呢?