• 0

Quick query regarding pointer to struct and heapalloc in C++...


Question

Got a quick C++ question here, tl;dr version is: Got a struct with some objects, creating a new array of objects, using heapalloc (which I thought would be similar to initialising them all manually, I can access/change VarB and VarC but whatever I try to do with VarA causes exception nightmare)

Long version: I've got a struct;

typedef struct ThreadSocketData
{
	list<SOCKET*> VarA;
	unsigned int VarB;
	unsigned int VarC;
} THREADSOCKETDATA, *PTHREADSOCKETDATA;

I'm allocating it as a global and in a function as;

PTHREADSOCKETDATA *pDataArrays;
...
pDataArrays = new PTHREADSOCKETDATA[2];
...
pDataArrays[i] = (PTHREADSOCKETDATA)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(THREADSOCKETDATA));

Then I try to use it like so;

pDataArrays[1]->VarB = 5;
cout << pDataArrays[1]->VarB << endl; //works fine
SOCKET *ASocket = new SOCKET;
*ASocket = 5;
pDataArrays[0]->VarA.push_back(ASocket); //exception crazy

I've tried created it alternatively and like so and it seems to work fine;

pDataArrays = new PTHREADSOCKETDATA[2];
pDataArrays[0] = new THREADSOCKETDATA;
pDataArrays[1] = new THREADSOCKETDATA;
pDataArrays[0]->VarC = 5;
pDataArrays[0]->VarB = 4;
pDataArrays[0]->VarA.begin();
SOCKET *ASocket = new SOCKET;
*ASocket = 18;
pDataArrays[0]->VarA.push_back(ASocket);

So why does the second way work but the first doesn't fully work? Surely using heapalloc would have the same effect as manually allocating it all?

10 answers to this question

Recommended Posts

  • 0

Operator new calls constructors, malloc/HeapAlloc don't. My guess is that in your first example, VarA is uninitialized because its constructor hasn't run, so you cannot use it.

This would all be moot if you were using C++ idioms rather than mixing C idioms in there. In C++ you use new and delete, not malloc, unless you're implementing an allocator or something. Actually, scratch that, in modern C++ you don't even write new and delete, you use smart pointers and containers (see for instance http://fr.slideshare.net/sermp/without-new-and-delete ). In your example if you replace all the C-style arrays with std::vector, and all the raw pointers with smart pointers, every constructor and destructor is guaranteed to run exactly when it should and you shouldn't be leaking anything or accessing uninitialized state.

Also, as a matter of style you don't need to write typedef struct MyType {} MYTYPE in C++, just struct MYTYPE {}, and you'd probably want to avoid SCREAMINGCAPS for all your type names if you don't want your code to look like 9-year olds having an internet argument.

  • 0

This is my first program with threading (not done it before) so I've been modifying the sample MSDN code which had it all in caps, not my idea of naming but good idea, I'll change that.

I don't think I can use smart pointers for this though? The pDataArray {i} is sent by reference to thread {i} although I want to be able to manipulate it from within the main thread therefore I left the heapalloc code as it was provided by MS, so if I remove all the heapalloc/heapfree and just use normal new/delete and pass that in CreateThread() it will work?

  • 0
  On 28/10/2015 at 21:08, Andre S. said:

Do you really need to use the Win32 function CreateThread rather than standard C++ threads

Well the problem is I'm making this program across 3 different types of PCs, my home PC has visual studio 2015 so std::thread is fine, I already use it to get the number of CPUs, another has visual studio 2013 and I'm not sure if it fully has std::thread or only parts of it? And the other has visual studio 2010, which doesn't have any std::thread support at all :(.

Using std::thread I can then pass it smart pointers or references to objects I manually new/delete and access them from the thread and main program? Also is there a std:: replacement for Createevent/Resetevent/Setevent/Waitformultipleobjects?

  • 0

VS2015 Community Edition is free ;)

Yes you can pass any object to an std::thread, look at the documentation. For a ManualResetEvent or AutoResetEvent you could implement that pretty straightforwardly with std::condition_variable and std::mutex, there are examples online.

 

  • 0
  On 28/10/2015 at 21:24, n_K said:

Well the problem is I'm making this program across 3 different types of PCs, my home PC has visual studio 2015 so std::thread is fine, I already use it to get the number of CPUs, another has visual studio 2013 and I'm not sure if it fully has std::thread or only parts of it? And the other has visual studio 2010, which doesn't have any std::thread support at all :(.

Using std::thread I can then pass it smart pointers or references to objects I manually new/delete and access them from the thread and main program? Also is there a std:: replacement for Createevent/Resetevent/Setevent/Waitformultipleobjects?

Like everyone says - VS2015 freebie - no need to be complicated

But you never said what sort of code you are making. If it's anything connected with Device drivers then the std stuff is out the window...

  • 0

I've got VS 2015 community on this pc which is fine - it's my PC. The other two PCs are not mine, they're in an educational establishment, I'm not administrator so I can't just install VS 2015 on them and why I have to put up with using 2010 and 2013 also.

I'll see if I can get a portable mingw working on the other PCs and see what happens if I chuck the code at that instead of using 2010 and 2013!

Nope not drivers, just testing out threads and winsock and the like. I've not looked into drivers, can MS drivers use multiple threads (even if not using std::thread threads)? Can Linux modules use threads (using std::thread)?

Thanks!

  • 0

It's a bad idea to mix allocation techniques like that unless you know what you're doing and it's for a good reason. In particular, STL data structures (such as list) only get initialised properly if you use the built-in new() operator to allocate them.

You might be able to get around it by calling new() on VarA after allocating the structure with malloc().

static const int ARRAY_SIZE = 20
THREADSOCKETDATA* myArray = malloc(ARRAY_SIZE * sizeof(THREADSOCKETDATA));

for (int i = 0; i < ARRAY_SIZE; i++)
    myArray[i].VarA = new list<SOCKET*>;
    
// clean up    
free(myArray);

I wouldn't recommend it though.

For efficiency purposes, I'd also allocate the entire array as a contiguous block of memory, rather than making multiple heap allocations for each individual structure.

  • 0
  On 29/10/2015 at 15:39, n_K said:

I've got VS 2015 community on this pc which is fine - it's my PC. The other two PCs are not mine, they're in an educational establishment, I'm not administrator so I can't just install VS 2015 on them and why I have to put up with using 2010 and 2013 also.

I'll see if I can get a portable mingw working on the other PCs and see what happens if I chuck the code at that instead of using 2010 and 2013!

Nope not drivers, just testing out threads and winsock and the like. I've not looked into drivers, can MS drivers use multiple threads (even if not using std::thread threads)? Can Linux modules use threads (using std::thread)?

Thanks!

Threads are easy to make. After that it can get interesting. There is a reason why just about every GUI system is limited to single-threaded.

If you are doing a real device driver for hardware then you have interrupts in which you need to store whatever you need within 30 millisecs and then Queue up worker threads to do the real processing which are also time limited so you then can have long running threads to process stuff as a background service. You need to be very aware of which variables are atomic and which data structures can get clobbered by your interrupt code, your DPC code, your worker thread etc. The killer is multi-core because it's so fast. It can look like impossible things happen like only 1/2 of a store to memory etc but then it turns out that compiler operation wasn't atomic...

The solution most people use is locks. After you do some device driver stuff, you learn to strike a more delicate balance. So learn what's atomic and every O/S has O/S API calls for safe atomic updates I think.

This topic is now closed to further replies.
  • Recently Browsing   0 members

    • No registered users viewing this page.
  • Posts

    • It's not. It's a rightwing lie peddled by liars to BillyBob'sFreedumb email chain. Feel free to provide any credible source to support this claim. You won't find a single one. The reason Biden wasn't prosecuted was because it was a handful of documents from the Obama years that were just in storage. And when the FBI asked for them, Biden and his team did everything they could to find them and return them immediately -- even ones the FBI didn't know were "missing". https://en.wikipedia.org/wiki/...assified_documents_incident Whereas the Charlatan in Chief stored mountains of classified material out in the open in his pay to play club infested with foreign spies. https://www.pbs.org/newshour/p...-mar-a-lago-shower-ballroom Trump also revealed this nation's most classified information to foreigners who had no clearance to access them...and then bragged about knowing them to their friends overseas. https://www.nbcnews.com/politi...arines-according-rcna119173 And not only are many still missing and not returned... https://www.cnn.com/interactiv...ssia-intelligence-trump-dg/ Trump denied having them to the FBI repeatedly and moved them around to avoid having to return them to the proper authorities for over a year. https://www.pbs.org/newshour/p...ing-of-classified-documents There is no credible legitimate comparison between the two classified documents cases. You might want to change the source of the information you are getting and falling for. They are obvious lying to you. PS On the content issue...I am a content creator. You and everyone else in world loves the franchises and content I have created and/or contributed meaningfully to. It's the studios that are doing everything they can to remove us, the content creators, from their balance sheets (now with AI)...not the people who consume what we create for free. We've already been paid, thanks. Blame Wall Street for forcing the bottomless greedy enshittification of everything American, not the consumers or the actual creators.
    • https://support.microsoft.com/...61ff-00a1-04e2-2d1f3865450d
    • https://support.microsoft.com/...61ff-00a1-04e2-2d1f3865450d
    • Swatle AI — the smarter way to manage your teams, projects, and tasks now 75% off by Steven Parker Today's highlighted deal comes via our Apps + Software section of the Neowin Deals store, where you can save 75% off on Swatle All-in-One AI Assistant (Premium lifetime subscription). Stop over-hiring and overspending to meet your productivity goals. Swatle is all you need to achieve more with less. Swatle is an all-in-one AI solution designed to supercharge your productivity without over-hiring or overspending. Whether you're managing projects, automating repetitive tasks, or organizing your team's workflow, Swatle can help you achieve more with less. Powered by cutting-edge artificial intelligence, it adapts to your needs, streamlines operations, and eliminates inefficiencies so you can focus on what matters most—growing your business. With Swatle, working smarter isn’t just a goal—it’s your new reality. Let Swatle AI handle the necessary mundane tasks. SWATLE AI PROJECT ASSISTANT Step-by-Step Guidance: For every task you assign, either write step-by-step instructions yourself or let Swatle AI write on your behalf Skip the Standups: Ask Swatle AI about project progress and get instant, actionable updates—no daily meetings needed Accurate Time Estimates: Plan your day better by estimating the time required to complete your tasks Message Refinement: Send crystal clear messages; Swatle AI will rephrase your message & make it crisp and clear Project Quality Boost: Turn normal project descriptions into a crystal-clear description TEAM COLLABORATION MADE EASY Streamline Communication: Send & receive messages and updates within Swatle for real-time, tool-free collaboration Centralized Team Portfolios: Create dedicated portfolios to highlight your team's expertise & track their contributions effectively Conversational Task Creation: Instantly create tasks while having casual conversations with a single click. Make sure nothing falls through the crack Share Files & Feedback Directly: Eliminate scattered documents and email threads by sharing files and providing feedback directly in Swatle chat SWATLE TASKDESK Non-Technical Projects: Specifically designed for projects like marketing campaigns, content creation, and event planning Visualize Work Your Way: Manage tasks through Kanban boards, lists, Gantt charts, or Timelines—whatever fits your flow AI Task Assistant: Break down complex tasks into manageable subtasks quickly & easily Workload Tracking: View the workload of your team members & distribute tasks across the team to encourage a balanced workload. Proactive Notifications: Effortlessly keep your projects on track with timely, proactive notifications SWATLE DEVBOARD Technical Projects: Create unlimited sprints & backlogs for full control and visibility into every phase of your projects Burndown Chart: Provides a clear, real-time visual representation of your team's work remaining against the sprint timeline Set Goals, Create Sprints, Achieve More: Define your objectives and launch focused sprints that empower your team to concentrate on key tasks within short, impactful cycles Why choose Swatle? No Learning Curve: Swatle offers a remarkably easy-to-use interface. Empower your entire team to understand project progress without requiring technical expertise. Actionable Intelligence: Swatle turns raw project data into visualizations, like Assigned vs Completed charts, enabling focused analysis without manual effort. Proactively Mitigate Risks: Swatle visual dashboards make it easy to spot potential delays, bottlenecks, and resource imbalances, enabling you to take timely action and keep your projects on track. Ensure Resources Are Optimized: By visualizing workloads, you can strategically distribute tasks, promote a balanced environment, and prevent team burnout. Maintain Project Alignment & Stakeholder Confidence: Keep everyone from your internal team to clients and stakeholders on the same page with clear Gantt and Timeline views. Good to know Length of access: lifetime Redemption deadline: redeem your code within 30 days of purchase Access options: desktop or mobile Max number of device(s): unlimited Available to both NEW and Existing users Updates included This Swatle All-in-One AI Assistant (Premium lifetime subscription) normally costs $240, but this deal can be yours for just $59.99, that's a saving of $180. For full terms, specifications, and license info please click the link below. Get this lifetime Swatle Premium deal for just $59.99 (75% off) or learn more Although priced in U.S. dollars, this deal is available for digital purchase worldwide. We post these because we earn commission on each sale so as not to rely solely on advertising, which many of our readers block. It all helps toward paying staff reporters, servers and hosting costs. Other ways to support Neowin Whitelist Neowin by not blocking our ads Create a free member account to see fewer ads Make a donation to support our day to day running costs Subscribe to Neowin - for $14 a year, or $28 a year for an ad-free experience Disclosure: Neowin benefits from revenue of each sale made through our branded deals site powered by StackCommerce.
  • Recent Achievements

    • Reacting Well
      sultangris earned a badge
      Reacting Well
    • First Post
      ClarkB earned a badge
      First Post
    • Week One Done
      Epaminombas earned a badge
      Week One Done
    • Week One Done
      Prestige Podiatry Care earned a badge
      Week One Done
    • Week One Done
      rollconults earned a badge
      Week One Done
  • Popular Contributors

    1. 1
      +primortal
      144
    2. 2
      Xenon
      128
    3. 3
      ATLien_0
      124
    4. 4
      +Edouard
      102
    5. 5
      snowy owl
      97
  • Tell a friend

    Love Neowin? Tell a friend!